PR with complete fix for "main" and "2.8.0":
https://github.com/apache/airflow/pull/36243

Once it passes all the tests and we will know the solution there works, I
will also start removing the repos for old released images.

J



On Fri, Dec 15, 2023 at 3:09 PM Jarek Potiuk <ja...@potiuk.com> wrote:

> Small update. Oracle/ MySQL **just** resigned their repo with a new key,
> with a new one. The new workaround is:
>
>
> *RUN apt-key adv --keyserver keyserver.ubuntu.com
> <http://keyserver.ubuntu.com> --recv-keys B7B3B788A8D3785C && gpg --export
> "B7B3B788A8D3785C" > "/etc/apt/trusted.gpg.d/mysql.gpg"*
>
> However this key has 2 years expiry so in ~ 2 years we will have the same
> problem again and all our released images will have a similar problem if we
> do not switch to mariadb/remove the repository for MySQL (which might have
> side effects).
>
>
>
>
>
>
> *root@14002eba8b66:/opt/airflow# gpg --list-keys B7B3B788A8D3785Cpub
> rsa4096 2023-10-23 [SC] [expires: 2025-10-22]
> BCA43417C3B485DD128EC6D4B7B3B788A8D3785Cuid           [ unknown] MySQL
> Release Engineering <mysql-bu...@oss.oracle.com
> <mysql-bu...@oss.oracle.com>>sub   rsa4096 2023-10-23 [E] [expires:
> 2025-10-22]*
>
> So my take is - let's switch to MariaDB client. The Client is generally
> very thin and it follows well-defined and rather simple protocol, so I do
> not expect some "real" issues with it. I will send a LAZY CONSENSUS soon
> and PR with proposal of permanent fix
>
> J.
>
>
>
> On Fri, Dec 15, 2023 at 1:46 PM Jarek Potiuk <ja...@potiuk.com> wrote:
>
>> > Isn't there the other option and that is to include the key for
>> verification. Thus pinning the certificate / key? This way it is more safe
>> to ignore the expiry date?
>>
>> Very good question.
>>
>> We already HAD the pinned certificate and that was part of the problem
>> (the expired key ID is hard-coded in all our past images). Pinning the key
>> is one thing and recommended, but `apt` will verify such a key (correctly)
>> anyway and when it is expired, apt will refuse it, unless you allow the
>> repo to be - basically - unverified.
>>
>> With Andrey we looked at  other options but it seems there is no `easy`
>> way to **just** ignore expiry date for that certificate. But if someone
>> knows other ways to only ignore expiration, that would be best. We could
>> not find such a selective option. We **could** potentially temporary change
>> the container's system date during this installation step (and hard code it
>> to the day before yesterday for example), but it would be extremely lame
>> and there could be many side-effects in the future, so I personally rule it
>> out as an option.
>>
>> There are two ways to ignore an expired key. You can apply it per
>> repository (but it does not make them more secure this way):
>>
>> •Trusted (trusted) is a tri-state value which defaults to APT deciding if
>> a source is considered trusted or if warnings should be raised before e.g.
>> packages are installed from this source. This option can be used to
>> override that decision. The value yes tells APT always to consider this
>> source as trusted, even if it doesn't pass authentication checks. It
>> disables parts of apt-secure(8), and should therefore only be used in a
>> local and trusted context (if at all) as otherwise security is breached.
>> The value no does the opposite, causing the source to be handled as
>> untrusted even if the authentication checks passed successfully. The
>> default value can't be set explicitly.
>>
>> •Allow-Insecure (allow-insecure), Allow-Weak (allow-weak) and
>> Allow-Downgrade-To-Insecure (allow-downgrade-to-insecure) are boolean
>> values which all default to no. If set to yes they circumvent parts of
>> apt-secure(8) and should therefore not be used lightly!
>>
>> Both of them are security risks.
>>
>> And to add, how bad (and pretty unexpected and wrong) Oracle's policy is.
>> EVERYONE ELSE uses signing keys without expiry date, precisely to avoid
>> this kind of problem. MariaDB, Postgres, and even MSSQL keys have no expiry
>> date - I think because unlike Oracle, they care about their users so they
>> do not have to worry about rebuilding all their past images every 2 years.
>> It's actually a bad practice for apt packages to add expiry dates for
>> signing keys because it basically means you are putting expiry on your
>> packages to be installed.
>>
>> Also a digression here: this is also one of the weaknesses of the GPG
>> security scheme - and that's why modern replacements that are coming
>> (sigstore is the main contender) are way better because there, you keep the
>> public ledger of who signed what and the keys used to sign the packages are
>> generated temporarily to sign the packages and private keys are deleted
>> afterwards. This is a way better schema and everyone is moving there
>> (including us working with Apache Software Foundation and planning to
>> implement it next year), but at least for now we are stuck with what we
>> have, and signing keys for apt packages should have no expiry date. This is
>> a big flaw in Oracle/MySQL approach and to be honest, I kind of lost my
>> faith in them doing a good job on maintaining MySQL repos.
>>
>> J.
>>
>>
>>
>>
>> On Fri, Dec 15, 2023 at 1:17 PM Bolke de Bruin <bdbr...@gmail.com> wrote:
>>
>>> Isn't there the other option and that is to include the key for
>>> verification. Thus pinning the certificate / key? This way it is more
>>> safe
>>> to ignore the expiry date?
>>>
>>> I'm okay with all the other options just verifying if we are not
>>> overlooking anything. The reason for this is that we do not support
>>> MariaDB
>>> as a backend (afaik) but now we suddenly use the client as a dependency
>>> to
>>> talk to MySQL servers?
>>>
>>> My 2 cents,
>>> Bolke
>>>
>>> On Fri, 15 Dec 2023 at 12:36, Andrey Anshin <andrey.ans...@taragol.is>
>>> wrote:
>>>
>>> > I would rather stick to the Option 2, with small modifications:
>>> > By default use MariaDB libraries which compatible with MySQL, so change
>>> > everywhere INSTALL_MYSQL_CLIENT_TYPE=mariadb
>>> > - For x86_64 keep option to switch to Oracle MySQL libraries
>>> > - For ARM it would always forced (or until Oracle provide arm
>>> compatible
>>> > binaries for Debian) to mariad
>>> >
>>> > I think it is pretty safe to use it, because for a long time popular
>>> linux
>>> > distributions such as Debian, Ubuntu, RHEL, Centos provide MariaDB
>>> > libraries as compatible with MySQL. For example Debian Bookworm:
>>> > https://packages.debian.org/bookworm/default-mysql-client
>>> >
>>> > And this also make consistent ARM and x86_64 by default, and keep
>>> > possibility to build custom image with Oracle libraries
>>> >
>>> > ---
>>> >
>>> > Maybe someone who uses custom images for their Managed Airflow Services
>>> > could give info about what kind of libraries they use for MySQL? I
>>> assume
>>> > in AWS MWAA also use MariaDB (at least what i could see for
>>> local-runner)
>>> > but it my assumption which required confirmation before taking it into
>>> the
>>> > account.
>>> >
>>> > On Fri, 15 Dec 2023 at 14:54, Jarek Potiuk <ja...@potiuk.com> wrote:
>>> >
>>> > > Hello everyone,
>>> > >
>>> > > (sorry for capital letters but we need to act quickly).
>>> > >
>>> > > *TL;DR; Due to Oracle breaking MySQL repo signing, Together with
>>> Andrey
>>> > we
>>> > > have a proposal to - immediately - switch to MariaDB clients in
>>> Airflow
>>> > > images for main and the upcoming Airflow 2.8.0 - giving the user an
>>> > option
>>> > > to build their own custom images with MySQL clients if they need
>>> > > compatibility. *
>>> > >
>>> > > Last night it turned out that Oracle failed miserably with managing
>>> > signing
>>> > > their repositories and their repositories are now badly signed with
>>> > expired
>>> > > keys since yesterday. They acknowledged the issue and they apparently
>>> > > started to fix it but we have no idea how long it will take.
>>> > >
>>> > > The problem is that the policy for signing the MySQL repos Oracle is
>>> > > essentially flawed - the expiry date is very short - and we will
>>> have to
>>> > > re-release all (!) our historical images - with removed Mysql
>>> repository.
>>> > >
>>> > > Currently none of our users can extend our images without applying a
>>> > > workaround where they remove the mysql repository manually or allow
>>> > > unsecure repositories.
>>> > >
>>> > > *Context*:
>>> > >
>>> > > Just about we should have our Airflow 2.8.0 release, we have a high
>>> > > severity breaking change caused by Oracle failing miserably in
>>> resigning
>>> > > their MySQL repositories. The key they used to sign the repositories
>>> > > expired yesterday.
>>> > >
>>> > > They have a new key released in October - that has expiry date in
>>> 2025 -
>>> > > but they forgot to re-sign their repositories with it and currently
>>> it is
>>> > > not possible to securely install MySQL packages via their APT
>>> > repositories
>>> > > at all. There is simply no way to do it securely (!).
>>> > >
>>> > > If they did it in October, we would have much more time to react and
>>> fix
>>> > > it, but they have not and now we are in a difficult situation (and it
>>> > will
>>> > > likely delay the 2.8.0 release).
>>> > >
>>> > > We track the issue in https://github.com/apache/airflow/issues/36231
>>> > >
>>> > > There are two severe issues in MySQL bug system (I commented on both
>>> of
>>> > > them):
>>> > >
>>> > > https://bugs.mysql.com/bug.php?id=113427
>>> > > https://bugs.mysql.com/bug.php?id=113428
>>> > >
>>> > > Basically anyone installing MySQL from the official APT repos has
>>> this
>>> > > problem now.
>>> > >
>>> > > *Bigger Problem:*
>>> > >
>>> > > The problem is that the way Oracle policy is set (even if they would
>>> not
>>> > > forget to resign the repos), is flawed. It means that all our images
>>> that
>>> > > we release have fixed expiry date (2023-12-14 as it turned out) and
>>> we
>>> > will
>>> > > have to re-release the images again when they change the key and
>>> > basically
>>> > > it requires manually applying the new key when they re-sign the repos
>>> > > anyway.
>>> > >
>>> > > The current workaround is to add this by to their Dockerfile when
>>> they
>>> > are
>>> > > extending any of our past images:
>>> > >
>>> > >
>>> > > *RUN rm /etc/apt/sources.list.d/mysql.list*
>>> > >
>>> > > But this has side effects - for example if someone will run `apt
>>> upgrade`
>>> > > as part of their process, mysql clients will get installed from the
>>> > > "distro" packages - and they will be outdated.  Another workaround
>>> is to
>>> > > add
>>> > >
>>> > > *RUN apt update --allow-insecure-repositories*
>>> > >
>>> > > But this has obvious issues with security and is not at all
>>> recommended.
>>> > >
>>> > > We will basically have to rebuild and re-release all our images in
>>> order
>>> > to
>>> > > fix the problem - regardless of what Oracle does. This is something
>>> we
>>> > > discuss with Andrey how to address it in the best way.
>>> > >
>>> > > *Options we have for now:*
>>> > >
>>> > > We discussed it with Andrey and we are discussing how to prevent it
>>> > > happening in the future but we have immediate issue to address now -
>>> for
>>> > > the upcoming 2.8.0
>>> > >
>>> > > We have the following options:
>>> > >
>>> > > 1) We wait until Oracle fixes it and signs the repos with new keys.
>>> The
>>> > new
>>> > > keys are valid till 2025. However we can modify our dockerfile to
>>> remove
>>> > > the mysql repositories after installing mysql to avoid similar
>>> problems
>>> > in
>>> > > the future. They responded that they are uploading new keys but we
>>> are
>>> > not
>>> > > sure if we have
>>> > >
>>> > > 2) Thanks to what Andrey implemented a few months ago we have an
>>> easy way
>>> > > to switch to MariaDB clients. Those are binary compatible with MySQL
>>> and
>>> > > they are stable and production ready, and they pass all our tests in
>>> CI -
>>> > > https://github.com/apache/airflow/pull/36235
>>> > >
>>> > > 3) Drop MySQL support. Joking here of course - though I suggested it
>>> in
>>> > the
>>> > > past a few times because of all the problems we have with MySQL and
>>> this
>>> > > one is by far the worst problem we and our users could have
>>> experienced).
>>> > >
>>> > > Option 1) is a bit "safer" in the "corporate" world - generally
>>> sticking
>>> > to
>>> > > the "official" clients of "official" DB that we support is the
>>> default.
>>> > > Though my trust with Oracle as MySQL steward had been greatly
>>> diminished
>>> > by
>>> > > that issue and the flawed approach for their policies. But we do not
>>> know
>>> > > how long it will take.
>>> > >
>>> > > Option 2) MariaDB is also very popular and solid and exhibits no such
>>> > > issues - their signing key is set to "no expiry" so if we switch to
>>> > > MariaDB, the problem will be gone. We run it for months for all our
>>> ARM
>>> > > images - and anyone using ARM Macbooks and running MySQL with Breeze
>>> > would
>>> > > use those.
>>> > >
>>> > > *Recommendation:*
>>> > >
>>> > > Both myself and Andrey's recommendation is to go to MariaDB for main
>>> and
>>> > > 2.8.0. We are pretty fed-up with a number of past issues we had to
>>> fight
>>> > > with - and even if Oracle fixes it now, we have no faith Oracle can
>>> be
>>> > > trusted as MySQL steward for the repos (Andrey did not have faith for
>>> > quite
>>> > > some time now and I lost it today).
>>> > >
>>> > > In order to respond to potential edge cases, we can also keep the
>>> option
>>> > > that users who really want it, might be able to rebuild the image
>>> with
>>> > > MySQL drivers - similarly as we give the users the option to use
>>> bullseye
>>> > > in 2.8.0. And we can even run a CI build with it to see that it
>>> continues
>>> > > to work.
>>> > >
>>> > > I believe this is the best option and we can get it implemented
>>> quickly
>>> > > today and get RC4 of Airflow with mariadb clients. If we see a
>>> > > support/consensus for the community we will **just** proceed with it
>>> and
>>> > > start a formal LAZY_CONSENSUS thread.
>>> > >
>>> > > WDYT?
>>> > >
>>> > > J.
>>> > >
>>> >
>>>
>>>
>>> --
>>>
>>> --
>>> Bolke de Bruin
>>> bdbr...@gmail.com
>>>
>>

Reply via email to