Hi All,
I am setting up puppetmaster with nginx and passenger and separating
the Puppetmaster primary CA server. I have 3 host
loadbalancer01 - Nginx doing LB on IP address and also running
puppetmaster with passenger under 127.0.0.1 (port 8140).
primaryca - Puppetmaster Primary CA
pclient - Puppet Client
The did the following steps:
On Primary CA server:
----------------------------
cd /var/lib/puppet/
puppetca generate
puppet cert -g loadbalancer01 --
certdnsnames=puppetmaster:loadbalancer01
puppet cert -g primaryca --certdnsnames=puppetmaster:primaryca
scp private_keys/loadbalancer01.pem root@loadbalancer01:/var/lib/
puppet/ssl/private_keys/
scp ca/signed/loadbalancer01.pem root@loadbalancer01:/var/lib/puppet/
ssl/certs/
scp ca/ca_crt.pem root@loadbalancer01:/var/lib/puppet/ssl/certs/ca.pem
On loadbalancer01
----------------------
cd /var/lib/puppet
mkdir -p ssl/private_keys ssl/certs
Following are the nginx/puppet.conf configs of loadbalancer01
----------------------------------------------------------------------------------
[main]
logdir = /var/log/puppet
rundir = /var/run/puppet
ssldir = $vardir/ssl
[agent]
classfile = $vardir/classes.txt
localconfig = $vardir/localconfig
server = loadbalancer01
listen = true
[master]
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY
ca = false
-------------
Nginx.conf
---------------
user nginx;
worker_processes 10;
worker_rlimit_nofile 100000;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 1024;
use epoll;
}
http {
passenger_root /usr/lib/ruby/gems/1.8/gems/passenger-3.0.7;
passenger_ruby /usr/bin/ruby;
include mime.types;
default_type application/octet-stream;
## Common options ##
include options.conf;
## Proxy settings ##
include proxy.conf;
## lb domains ##
include puppetmasterlb.conf;
include lb01.conf;
}
--------- lb01.conf -------------
server {
listen
127.0.0.1:8140;
# server_name loadbalancer01;
root /etc/puppet/puppetmaster/public;
passenger_enabled on;
passenger_use_global_queue on;
rails_env production;
ssl off;
access_log /var/log/puppet/lb01_access.log;
error_log /var/log/puppet/lb01_error.log;
passenger_set_cgi_param SSL_CLIENT_S_DN
$ssl_client_s_dn;
passenger_set_cgi_param SSL_CLIENT_VERIFY
$ssl_client_verify;
# make sure we serve everything as raw
types { }
default_type application/x-raw;
# serve static file for the [files] mountpoint
location /production/file_content/files/ {
allow
192.168.122.0/24;
allow all;
alias /etc/puppet/files/;
}
# serve modules files sections
location ~ /production/file_content/[^/]+/files/ {
allow
192.168.122.0/24;
allow all;
root /etc/puppet/modules;
# rewrite /production/file_content/module/files/file.txt to /
module/file.text
rewrite ^/production/file_content/([^/]+)/files/(.+)$
$1/$2 break;
}
}
--------------- puppetmasterlb.conf ----------
# Backend puppetmasters and ca servers
upstream puppetmasters {
server
127.0.0.1:8140;
# server pserver02:8140;
}
upstream puppetca {
server primaryca:8140;
server secondaryca:8140 backup;
}
server {
listen
192.168.122.14:8140;
server_name loadbalancer01;
ssl on;
ssl_session_timeout 5m;
ssl_certificate /var/lib/puppet/ssl/certs/loadbalancer01.pem;
ssl_certificate_key /var/lib/puppet/ssl/private_keys/
loadbalancer01.pem;
ssl_client_certificate /var/lib/puppet/ssl/certs/ca.pem;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP;
ssl_prefer_server_ciphers on;
ssl_verify_client optional;
ssl_verify_depth 1;
access_log logs/loadbalancer01_access.log main;
error_log logs/loadbalancer01_error.log;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Client-Verify $ssl_client_verify;
proxy_set_header X-Client-DN $ssl_client_s_dn;
proxy_set_header X-SSL-Subject $ssl_client_s_dn;
proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
proxy_buffer_size 16k;
proxy_buffers 8 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_read_timeout 65;
location ^~ /production/certificate/ca {
proxy_pass
https://puppetca;
}
location ^~ /production/certificate {
proxy_pass
https://puppetca;
}
location ^~ /production/certificate_revocation_list/ca {
proxy_pass
https://puppetca;
}
location ^~ / {
proxy_pass
http://puppetmasters;
}
}
--- nginx.conf of Primary CA ---------
user nginx;
worker_processes 10;
worker_rlimit_nofile 100000;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 1024;
use epoll;
}
http {
passenger_root /usr/lib/ruby/gems/1.8/gems/passenger-3.0.7;
passenger_ruby /usr/bin/ruby;
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local]
"$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
# These are good default values.
tcp_nopush on;
tcp_nodelay off;
server_tokens off;
keepalive_timeout 65;
server {
listen
192.168.122.17:8140;
server_name primaryca;
root /etc/puppet/puppetmaster/public;
passenger_enabled on;
passenger_use_global_queue on;
rails_env production;
ssl on;
ssl_session_timeout 5m;
ssl_certificate /var/lib/puppet/ssl/certs/primaryca.pem;
ssl_certificate_key /var/lib/puppet/ssl/private_keys/
primaryca.pem;
ssl_client_certificate /var/lib/puppet/ssl/ca/ca_crt.pem;
ssl_crl /var/lib/puppet/ssl/ca/ca_crl.pem;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP;
ssl_prefer_server_ciphers on;
ssl_verify_depth 1;
access_log /var/log/puppet/primaryca_access.log;
error_log /var/log/puppet/primaryca_error.log;
passenger_set_cgi_param SSL_CLIENT_S_DN
$ssl_client_s_dn;
passenger_set_cgi_param SSL_CLIENT_VERIFY
$ssl_client_verify;
}
}
--- puppet.conf Primary CA ----
[main]
logdir = /var/log/puppet
rundir = /var/run/puppet
ssldir = $vardir/ssl
[agent]
classfile = $vardir/classes.txt
localconfig = $vardir/localconfig
server = primaryca
listen = true
[master]
autosign = true
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY
certname = puppetmaster
ca = true
=========
When i sent a request from the puppet client machine(pclient). The CSR
gets signed by the primary ca server by checking
puppet cert --list --all
+ loadbalancer01 (A2:86:20:5A:47:EE:4F:6A:1D:66:94:CB:33:0E:F4:BE)
+ pclient (7E:D2:31:DC:5F:DB:B1:E1:90:82:46:69:2E:2C:28:BF)
+ primaryca (A0:B5:7F:6B:CC:0A:F7:A6:1E:7D:B4:E4:09:8D:47:17)
+ puppetmaster (56:62:43:FA:9C:67:F0:E7:DF:EB:9A:A1:71:1D:57:BB)
However i get the following error while trying to receive the catalog:
notice: Ignoring --listen on onetime run
err: Could not retrieve catalog from remote server: Error 403 on
SERVER: Forbidden request: pclient(192.168.122.12) access to /
certificate_revocation_list/ca [find] at line 93
warning: Not using cache on failed catalog
- I think this may be related to the auth.conf
--- Auth.conf on loadbalancer01
# allow nodes to retrieve their own catalog (ie their configuration)
path ~ ^/catalog/([^/]+)$
method find
allow $1
# allow all nodes to access the certificates services
path /certificate_revocation_list/ca
method find
allow *
# allow all nodes to store their reports
path /report
method save
allow *
# inconditionnally allow access to all files services
# which means in practice that fileserver.conf will
# still be used
path /file
allow *
### Unauthenticated ACL, for clients for which the current master
doesn't
### have a valid certificate
# allow access to the master CA
path /certificate/ca
auth no
method find
allow *
path /certificate/
auth no
method find
allow *
path /certificate_request
auth any
method find, save
allow *
# this one is not stricly necessary, but it has the merit
# to show the default policy which is deny everything else
path /
auth any
--- auth.conf on primaryca
# allow nodes to retrieve their own catalog (ie their configuration)
path ~ ^/catalog/([^/]+)$
method find
allow $1
# allow all nodes to access the certificates services
path /certificate_revocation_list/ca
method find
allow *
# allow all nodes to store their reports
path /report
method save
allow *
# inconditionnally allow access to all files services
# which means in practice that fileserver.conf will
# still be used
path /file
allow *
### Unauthenticated ACL, for clients for which the current master
doesn't
### have a valid certificate
# allow access to the master CA
path /certificate/ca
auth no
method find
allow *
path /certificate/
auth no
method find
allow *
path /certificate_request
auth any
method find, save
allow *
# this one is not stricly necessary, but it has the merit
# to show the default policy which is deny everything else
path /
auth any
- Have i configured anythng wrong.
---- I am trying to split the CA requests to the primaryCA server and
the non CA requests to the puppetmaster running on the localhost.
I had read in the Pro puppet book that this can be done in Apache with
the following directives.
# Ordering of ProxyPass directives is important
# Direct all Puppet agent CA requests to a specific set of workers.
ProxyPassMatch ^(/.*?)/(certificate.*?)/(.*)$ balancer://puppetmasterca
ProxyPassReverse ^(/.*?)/(certificate.*?)/(.*)$ balancer://puppetmasterca
# Direct all other Puppet agent requests to the default set of
workers.
ProxyPass / balancer://puppetmaster/
ProxyPassReverse / balancer://puppetmaster/
ProxyPreserveHost On
However i would like to accomplish with nginx. Could any one help me
with this and also with the above error.
Regards,
Kevin