Redistributor recommendations for PEP 476
This commit is contained in:
parent
0a061a8694
commit
f2399fc422
|
@ -0,0 +1,158 @@
|
|||
PEP: 493
|
||||
Title: HTTPS verification recommendations for Python 2.7 redistributors
|
||||
Version: $Revision$
|
||||
Last-Modified: $Date$
|
||||
Author: Nick Coghlan <ncoghlan@gmail.com>, Robert Kuska <rkuska@redhat.com>
|
||||
Status: Draft
|
||||
Type: Informational
|
||||
Content-Type: text/x-rst
|
||||
Created: 10-May-2015
|
||||
|
||||
Abstract
|
||||
========
|
||||
|
||||
PEP 476 updated Python's default handling of HTTPS certificates to be
|
||||
appropriate for communication over the public internet. The Python 2.7 long
|
||||
term maintenance series was judged to be in scope for this change, with the
|
||||
new behaviour introduced in the Python 2.7.9 maintenance release.
|
||||
|
||||
This PEP provides recommendations to downstream redistributors wishing to
|
||||
provide a smoother migration experience when helping their users to manage
|
||||
this change in Python's default behaviour.
|
||||
|
||||
.. note::
|
||||
|
||||
Note that this PEP is not currently accepted, so it is a *proposed*
|
||||
recommendation, rather than an active one.
|
||||
|
||||
Rationale
|
||||
=========
|
||||
|
||||
PEP 476 changed Python's default behaviour to better match the needs and
|
||||
expectations of developers operating over the public internet, a category
|
||||
which appears to include most new Python developers. It is the position of
|
||||
the authors of this PEP that this was a correct decision.
|
||||
|
||||
However, it is also the case that this change *does* cause problems for
|
||||
infrastructure administrators operating private intranets that rely on
|
||||
self-signed certificates, or otherwise encounter problems with the new default
|
||||
certificate verification settings.
|
||||
|
||||
The long term answer for such environments is to update their internal
|
||||
certificate management to at least match the standards set by the public
|
||||
internet, but in the meantime, it is desirable to offer these administrators
|
||||
a way to continue receiving maintenance updates to the Python 2.7 series,
|
||||
without having to gate that on upgrades to their certificate management
|
||||
infrastructure.
|
||||
|
||||
PEP 476 did attempt to address this question, by covering how to revert the
|
||||
new settings process wide by monkeypatching the ``ssl`` module to restore the
|
||||
old behaviour. Unfortunately, the ``sitecustomize.py`` based technique proposed
|
||||
to allow system administrators to disable the feature by default in their
|
||||
Standard Operating Environment definition has been determined not to work in
|
||||
at least some cases. The specific case of interest to the authors of this PEP
|
||||
is the one where a commercial redistributor aims to provide their users with
|
||||
a smoother migration path than the standard one provided by consuming the
|
||||
upstream CPython 2.7 distribution directly [#].
|
||||
|
||||
.. [#] https://bugzilla.redhat.com/show_bug.cgi?id=1173041
|
||||
|
||||
Rather than allowing a plethora of mutually incompatibile migration techniques
|
||||
to bloom, this PEP proposes a recommended approach for redistributors to take
|
||||
when addressing this problem on behalf of their users that provides the
|
||||
following capabilities:
|
||||
|
||||
* infrastructure administrators restoring the old behaviour as part of their
|
||||
standard system configuration
|
||||
* redistributors restoring the old behaviour as part of their standard
|
||||
platform configuration
|
||||
* infrastructure administators optionally and explicitly opting in to accepting
|
||||
a change in default behaviour at a future point in time as determined by their
|
||||
chosen redistributor
|
||||
|
||||
It aims to do this without introducing any new attack vectors that allow
|
||||
the security configuration to be downgraded back to the older less secure
|
||||
defaults.
|
||||
|
||||
This design is being proposed as a recommendation for redistributors, rather
|
||||
than as a new upstream feature, as it is needed primarily to support legacy
|
||||
environments migrating from older versions of Python 2.7 (The PEP authors
|
||||
aren't *opposed* to this capability existing as an upstream feature, we just
|
||||
don't need that ourselves - our aim is to avoid different redistributors
|
||||
doing different things, not to push the change upstream).
|
||||
|
||||
Recommendation
|
||||
==============
|
||||
|
||||
To smooth the migration path to verifying HTTPS certificates by default, it is
|
||||
recommended that redistributors:
|
||||
|
||||
* patch the ``ssl`` module to read a global configuration file when the module
|
||||
is imported
|
||||
* default to verifying certificates if this configuration file is not present
|
||||
* support the following three modes of operation in that configuration file:
|
||||
|
||||
* ensure HTTPS certificate verification is enabled
|
||||
* ensure HTTPS certificate verification is disabled
|
||||
* delegate the decision to the redistributor modifying upstream Python
|
||||
|
||||
An example patch is available at [#].
|
||||
|
||||
.. [#] https://bugs.python.org/issue23857
|
||||
|
||||
Recommended file location
|
||||
-------------------------
|
||||
|
||||
TBD separately for \*nix and Windows
|
||||
|
||||
Recommended file format
|
||||
-----------------------
|
||||
|
||||
ConfigParser ini-style format, other details TBD
|
||||
|
||||
Security Considerations
|
||||
=======================
|
||||
|
||||
The specific recommendations here are designed to work for privileged, security
|
||||
sensitive processes, being run in the following locked down configuration:
|
||||
|
||||
* run from a locked down administrator controlled directory rather than a normal
|
||||
user directory (preventing ``sys.path[0]`` based privilege escalation attacks)
|
||||
* run using the ``-E`` switch (preventing ``PYTHON*`` environment variable based
|
||||
privilege escalation attacks)
|
||||
* run using the ``-s`` switch (preventing user site directory based privilege
|
||||
escalation attacks)
|
||||
* run using the ``-S`` switch (preventing ``sitecustomize`` based privilege
|
||||
escalation attacks)
|
||||
|
||||
The intent is that the *only* reason HTTPS verification should be getting
|
||||
turned off globally is because:
|
||||
|
||||
* an end user is running a redistributor supported version of CPython rather
|
||||
than running upstream CPython directly
|
||||
* that redistributor has decided to provide a smoother migration path to
|
||||
verifying HTTPS certificates by default than that being provided by the
|
||||
upstream project
|
||||
* either the redistributor or the local infrastructure administrator has
|
||||
determined that it is appropriate to override the default upstream behaviour
|
||||
(at least for the time being)
|
||||
|
||||
Using an administrator controlled configuration file rather than an environment
|
||||
variable not only provides compatibility with the ``-E`` switch, but also
|
||||
ensures that in any situation where an attacker gains sufficient access to allow
|
||||
them to modify the configuration file, they're likely already in a position to
|
||||
attack the system certificate store directly.
|
||||
|
||||
Copyright
|
||||
=========
|
||||
|
||||
This document has been placed into the public domain.
|
||||
|
||||
|
||||
..
|
||||
Local Variables:
|
||||
mode: indented-text
|
||||
indent-tabs-mode: nil
|
||||
sentence-end-double-space: t
|
||||
fill-column: 70
|
||||
coding: utf-8
|
Loading…
Reference in New Issue