Skip to content

Commit 6320be9

Browse files
committed
Add a playbook to deploy an authenticating Pulp proxy
There is currently no practical, secure way to provide credentials for accessing Ark's authenticated package repositories from within a Kolla build. Docker provides build secrets, but these must be explicitly requested for each RUN statement, making them challenging to use in Kolla. This change adds a playbook that deploys an Nginx container that runs as a reverse proxy, injecting an HTTP basic authentication header into requests. Because this proxy bypasses Pulp's authentication, it must not be exposed to any untrusted environment. [1] https://docs.docker.com/build/building/secrets/
1 parent c794383 commit 6320be9

File tree

5 files changed

+92
-0
lines changed

5 files changed

+92
-0
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
# See roles/pulp_auth_proxy/README.md for details.
3+
4+
- name: Deploy Pulp auth proxy
5+
hosts: container-image-builders
6+
gather_facts: false
7+
tasks:
8+
- import_role:
9+
name: pulp_auth_proxy
10+
vars:
11+
pulp_auth_proxy_url: "{{ stackhpc_repo_mirror_url }}"
12+
pulp_auth_proxy_username: "{{ stackhpc_repo_mirror_username }}"
13+
pulp_auth_proxy_password: "{{ stackhpc_repo_mirror_password }}"
14+
pulp_auth_proxy_conf_path: "{{ base_path }}/containers/pulp_proxy"
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Pulp Auth Proxy
2+
3+
There is currently no practical, secure way to provide credentials for
4+
accessing Ark's authenticated package repositories from within a Kolla build.
5+
Docker provides [build
6+
secrets](https://docs.docker.com/build/building/secrets/), but these must be
7+
explicitly requested for each RUN statement, making them challenging to use in
8+
Kolla.
9+
10+
This role deploys an Nginx container that runs as a reverse proxy, injecting an
11+
HTTP basic authentication header into requests.
12+
13+
Because this proxy bypasses Pulp's authentication, it must not be exposed to
14+
any untrusted environment.
15+
16+
## Role variables
17+
18+
* `pulp_auth_proxy_pulp_url`: URL of the Pulp server to proxy requests to.
19+
* `pulp_auth_proxy_username`: Username of the Pulp server to proxy requests to.
20+
* `pulp_auth_proxy_password`: Password of the Pulp server to proxy requests to.
21+
* `pulp_auth_proxy_conf_path`: Path to a directory in which to write Nginx
22+
configuration.
23+
* `pulp_auth_proxy_listen_ip`: IP address on the Docker host on which to
24+
listen. Default is `127.0.0.1`.
25+
* `pulp_auth_proxy_listen_port`: Port on the Docker host on which to listen.
26+
Default is 80.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
pulp_auth_proxy_url:
3+
pulp_auth_proxy_username:
4+
pulp_auth_proxy_password:
5+
pulp_auth_proxy_conf_path:
6+
pulp_auth_proxy_listen_ip: 127.0.0.1
7+
pulp_auth_proxy_listen_port: 80
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
---
2+
- name: "Ensure {{ pulp_auth_proxy_conf_path }} exists"
3+
ansible.builtin.file:
4+
path: "{{ pulp_auth_proxy_conf_path }}"
5+
state: directory
6+
mode: 0700
7+
become: true
8+
9+
- name: Ensure pulp_proxy.conf is templated
10+
ansible.builtin.template:
11+
src: pulp_proxy.conf.j2
12+
dest: "{{ pulp_auth_proxy_conf_path }}/pulp_proxy.conf"
13+
mode: 0600
14+
become: true
15+
register: pulp_proxy_conf
16+
when: true
17+
18+
- name: Ensure pulp_proxy container is running
19+
community.docker.docker_container:
20+
name: pulp_proxy
21+
image: nginx:stable-alpine
22+
ports:
23+
- "{{ pulp_auth_proxy_listen_ip }}:{{ pulp_auth_proxy_listen_port }}:80"
24+
restart_policy: "no"
25+
restart: "{{ pulp_proxy_conf is changed }}"
26+
volumes:
27+
- "{{ pulp_auth_proxy_conf_path }}/pulp_proxy.conf:/etc/nginx/conf.d/default.conf:ro"
28+
become: true
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
server {
2+
listen {{ pulp_auth_proxy_listen_port }};
3+
server_name pulp_proxy;
4+
location / {
5+
proxy_pass {{ pulp_auth_proxy_url }};
6+
proxy_set_header X-Real-IP $remote_addr;
7+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
8+
proxy_set_header X-Forwarded-Proto $scheme;
9+
proxy_set_header Host {{ pulp_auth_proxy_url | urlsplit('hostname') }};
10+
# The important part: add basic auth header
11+
proxy_set_header Authorization "Basic {{ (pulp_auth_proxy_username ~ ':' ~ pulp_auth_proxy_password) | b64encode }}";
12+
proxy_pass_header Authorization;
13+
# See https://stackoverflow.com/questions/25329941/nginx-caching-proxy-fails-with-ssl23-get-server-hellosslv3-alert-handshake-fail/25330027#25330027
14+
proxy_ssl_server_name on;
15+
proxy_ssl_protocols TLSv1.2;
16+
}
17+
}

0 commit comments

Comments
 (0)