FWIW, Distro repacks are advantageous in comparison to
"statically-bundled" releases that for example bundle in an outdated
version of OpenSSL, because when you `apt-get upgrade -y` that should
upgrade the OpenSSL that all the other distro packages depend upon.

Here's something that doesn't get called as frequently as `apt-get upgrade -y`:

```bash
pip install -U certifi
```

https://github.com/certifi/python-certifi (Mozilla's CA bundle
extracted into a Python package)

```bash
apt-get install -y ca-certificates
dnf install -y ca-certificates
```

On 2/24/21, Wes Turner <wes.tur...@gmail.com> wrote:
> On 2/23/21, Random832 <random...@fastmail.com> wrote:
>> I was reading a discussion thread
>> <https://gist.github.com/tiran/2dec9e03c6f901814f6d1e8dad09528e> about
>> various issues with the Debian packaged version of Python, and the
>> following
>> statement stood out for me as shocking:
>>
>> Christian Heimes wrote:
>>> Core dev and PyPA has spent a lot of effort in promoting venv because we
>>> don't want users to break their operating system with sudo pip install.
>>
>> I don't think sudo pip install should break the operating system. And I
>> think if it does, that problem should be solved rather than merely
>> advising
>> users against using it. And why is it, anyway, that distributions whose
>> package managers can't coexist with pip-installed packages don't ever
>> seem
>> to get the same amount of flak for "damaging python's brand" as Debian is
>> getting from some of the people in the discussion thread? Why is it that
>> this community is resigned to recommending a workaround when
>> distributions
>> decide the site-packages directory belongs to their package manager
>> rather
>> than pip, instead of bringing the same amount of fiery condemnation of
>> that
>> practice as we apparently have for *checks notes* splitting parts of the
>> stdlib into optional packages? Why demand that pip be present if we're
>> not
>> going to demand that it works properly?
>>
>> I think that installing packages into the actual python installation,
>> both
>> via distribution packaging tools and pip [and using both simultaneously -
>> the Debian model of separated dist-packages and site-packages folders
>> seems
>> like a reasonable solution to this problem] can and should be a supported
>> paradigm, and that virtual environments [or more extreme measures such as
>> shipping an entire python installation as part of an application's
>> deployment] should ideally be reserved for the rare corner cases where
>> that
>> doesn't work for some reason.
>>
>> How is it that virtual environments have become so indispensable, that
>> no-one considers installing libraries centrally to be a viable model
>> anymore? Are library maintainers making breaking changes too frequently,
>> reasoning that if someone needs the old version they can just venv it? Is
>> there some other cause?
>
> First, pip+venv is not sufficient for secure software deployment:
> something must set appropriate permissions so that the application
> cannot overwrite itself and other core libraries (in order to
> eliminate W^X violations (which e.g. Android is solving by requiring
> all installed binaries to come from an APK otherwise they won't and
> can't be labeled with the SELinux extended file atrributes necessary
> for a binary to execute; but we don't have binaries, we have an
> interpreter and arbitrary hopefully-signed somewhere source code, at
> least)).
>
> Believe it or not, this is wrong:
>
> ```bash
> # python -m venv httpbin || virtualenv httpbin
> # source httpbin/bin/activate
> mkvirtualenv httpbin
>
> pip install httpbin gunicorn
> gunicorn -b 0.0.0.0:8001 httpbin:app
>
> # python -m webbrowser http://127.0.0.1:8001
> ```
>
> It's wrong - it's insecure - because the user executing the Python
> interpreter (through gunicorn, in this case) can overwrite the app.
> W^X: has both write and execute permissions. What would be better?
>
> This would be better because pip isn't running setup.py as root (with
> non-wheels) and httpbin_exec can't modify the app interpreter or the
> code it loads at runtime:
>
> ```bash
> useradd httpbin # also creates a group also named 'httpbin'
> sudo -u httpbin sh -c ' \
>     python -m venv httpbin; \
>     umask 0022; \
>     ./httpbin/bin/python -m pip install httpbin gunicorn'
>
> useradd httpbin_exec -G httpbin
> sudo -u httpbin_exec './httpbin/bin/gunicorn -b 0.0.0.0:8001 httpbin:app'
> ```
>
> This would be better if it worked, though there are a few caveats:
>
> ```bash
> sudo apt-get install python-gunicorn python-httpbin
> sudo -u nobody /usr/bin/gunicorn -b 0.0.0.0:8001 httpbin:app
> ```
>
> 1. Development is impossible:
> - You can't edit the code in /usr/lib/python3.n/site-package/ without
> root permissions.
> - You should not be running an editor as root.
> - You can edit distro-package files individually with e.g. sudoedit
> (and then the GPG-signed package file checksums will fail when you run
> `debsums` or `rpm -Va` because you've edited the file and that's
> changed the hash).
>
> - Non-root users cannot install python packages without having someone
> repack (and sign it) for them.
>
> - What do I need to do in order to patch the distro's signed repack of
> the Python package released to PyPI?
>   - I like how Fedora pkgs and conda-forge have per-package git repos now.
>   - Conda-forge has a bot that watches PyPI for new releases and tries
> sending an automated PR.
>   - If I send a PR to the main branch of the source repo and it gets
> merged, how long will it be before there's a distro repack built and
> uploaded to the distro package index?
>
> 2. It should be installed in a chroot/jail/zone/container/context/vm
> so that it cannot read other data on the machine.
> The httpbin app does not need read access to /etc/shadow, for example.
> Distro package installs are not - either - sandboxed.
>
> To pick on httpbin a bit more, the httpbin docs specify that httpbin
> should be run as a docker container:
>
> ```bash
> docker run -p 80:8001 kennethreitz/httpbin
> ```
>
> Is that good enough? We don't know, we haven't reviewed:
>
> - the Dockerfile
>   - it says `FROM ubuntu:18.04`, which is fortunately an LTS release.
> But if it hasn't been updated this month, it probably has the sudo bug
> that enabled escalation to root (which - even in a container - is bad
> because it could obnoxiously just overwrite libc, for example, and
> unless the container is rebuilt or something runs `debsums`, nothing
> will detect that data integrity error)
> - the requirements.txt / setup.py:install_requires / Pipfile[.lock]
> dependencies
>   - does it depend upon outdated pinned exact versions?
>     - Is there an SBOM (Software Bill of Materials) that we can review
> against known vulnerability databases?
>
> How do I know that:
>
> - The packages I have installed are not outdated and unpatched against
> known vulnerabilities
> - The files on disk are exactly what should be in the package
> - The app_exec user can't overwrite the binary interpreter or the
> source files it loads at runtime
> - There won't be unreviewed code running as root (including at install
> time)
> - All Python package dependencies are available as wheels (that
> basically only need to be unzipped)
> - The ensemble of dependencies which I've miraculously assembled is
> available on the target platform(s)
> - The integration tests for my app pass with each combination of
> dependencies which satisfy the specified dependency constraints
> - I can edit things and quickly re-test
> - Each dependency is signed by a key that's valid for that dependency
>
> So, if pip is insufficient for secure software deployment, what are
> pro teams using to build signed, deployable artifacts with fresh,
> upgaded dependencies either bundled in or loosely-referenced?
>
> - Bazel (from Google's internal Blaze) builds from BUILD files.
>   - https://github.com/dropbox/dbx_build_tools
> - Pantsbuild, Buck
> - zipapps
> - FPM can apparently package up an entire virtualenv; though IDK how
> good it is at permissions?
>
> https://github.com/jordansissel/fpm/blob/master/lib/fpm/package/virtualenv.rb
>
> As an open source maintainer, there are very many potential
> environments to release builds for.
> Manylinux docker images (and auditwheel, delocate, and *cibuildwheel*)
> are a response to extreme and somewhat-avoidable complexity.
> https://github.com/joerick/cibuildwheel
>
> Distro packagers can and do build upon e.g. pip; which is great for
> development but not sufficient for production deployment due to lack
> of support for file permissions, extended file attributes, checksums,
> cryptographic signatures, and due to running setup.py as the install
> user for non-wheel packages.
>
> There are many deployment stories now: pull/push, configuration
> management systems, venvs within containers within VMs. For your
> favorite distro, how do I get from cibuildwheel to a signed release
> artifact in your package index; and which keys can sign for what?
>


-- 
Wes Turner
https://westurner.org
https://wrdrd.com/docs/consulting/knowledge-engineering
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/YE64OOO6STWXUDYOHRAYK4A3BSEYQTF3/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to