Fix fedpkg double uploads by abusing the krb5 replay cache being local
Signed-off-by: Patrick Uiterwijk <puiterwijk@redhat.com>
This commit is contained in:
parent
0a0268b89e
commit
dc7d020e21
3 changed files with 60 additions and 0 deletions
|
@ -49,6 +49,8 @@
|
|||
website: codecs.fedoraproject.org
|
||||
- role: fedora-web/alt
|
||||
website: alt.fedoraproject.org
|
||||
- role: fedora-web/src
|
||||
website: src.fedoraproject.org
|
||||
|
||||
# Some other static content, not strictly part of "fedora-web" goes below here
|
||||
- role: fedora-docs/proxy
|
||||
|
|
12
roles/fedora-web/src/tasks/main.yml
Normal file
12
roles/fedora-web/src/tasks/main.yml
Normal file
|
@ -0,0 +1,12 @@
|
|||
# For info, check roles/httpd/reverseproxy/templates/reversepassproxy.src.conf
|
||||
- name: Install the pkgs keytab
|
||||
file: src="{{ private }}/files/keytabs/{{env}}/pkgs"
|
||||
dest=/etc/pkgs.keytab
|
||||
owner=apache
|
||||
group=apache
|
||||
mode=0600
|
||||
notify:
|
||||
- reloadhttpd
|
||||
tags:
|
||||
- fedora-web
|
||||
- fedora-web/src
|
46
roles/httpd/reverseproxy/templates/reversepassproxy.src.conf
Normal file
46
roles/httpd/reverseproxy/templates/reversepassproxy.src.conf
Normal file
|
@ -0,0 +1,46 @@
|
|||
{% if rewrite %}
|
||||
RewriteEngine On
|
||||
RewriteRule ^{{remotepath}}$ %{REQUEST_URI}/ [R=301]
|
||||
|
||||
{% endif %}
|
||||
{% if header_scheme %}
|
||||
RequestHeader set X-Forwarded-Scheme https early
|
||||
RequestHeader set X-Scheme https early
|
||||
RequestHeader set X-Forwarded-Proto https early
|
||||
|
||||
{% endif %}
|
||||
{% if header_expect %}
|
||||
RequestHeader unset Expect early
|
||||
|
||||
{% endif %}
|
||||
{% if keephost %}
|
||||
ProxyPreserveHost On
|
||||
{% endif %}
|
||||
|
||||
# If you are a krb5 purist, please skip this.
|
||||
# This is (ab)using the fact that krb5 replay cache is local to a server to protect against local attacks
|
||||
# while having an auth check on the proxies.
|
||||
# This is done because when fedpkg uploads a tarball, PycURL first sends an Expect: 100-Continue, but
|
||||
# unless the proxy is aware of the auth requirement, it will send the 100-Continue immediately, after
|
||||
# which the request will still fail (because pkgs will require auth).
|
||||
# What we do here is make the proxies require GSSAPI auth with the same keytab that pkgs uses.
|
||||
# As a consequence, the auth request is made by the proxies, avoiding the 100-Continue that causes
|
||||
# files to be uploaded twice.
|
||||
# However, I did not want to make the proxies send a plain HTTP header, since this means that whenever
|
||||
# someone gets into the local network, they could send their own request to the pkgs server, which will
|
||||
# then trust any username header (terrible idea, see CVE-2016-1000038).
|
||||
# So, instead, I just depend on mod_proxy forwarding the Authorization: Negotiate header that the client
|
||||
# sends on to pkgs, which will then *again* start a new GSSAPI security context and that way
|
||||
# authenticate the user on its own accord.
|
||||
# This depends on the fact that the krb5 replace cache is local, since both the terminating proxy *and*
|
||||
# pkgs will accept the GSSAPI security context.
|
||||
|
||||
<Location /repo/pkgs/upload.cgi>
|
||||
AuthType GSSAPI
|
||||
AuthName "GSSAPI Single Sign On Login"
|
||||
GssapiCredStore keytab:/etc/pkgs.keytab
|
||||
Require valid-user
|
||||
</Location>
|
||||
|
||||
ProxyPass {{ localpath }} {{ proxyurl }}{{remotepath}}
|
||||
ProxyPassReverse {{ localpath }} {{ proxyurl }}{{remotepath}}
|
Loading…
Add table
Add a link
Reference in a new issue