Browse code

Merge "Allow deploying keystone with SSL certificates"

Jenkins authored on 2013/12/04 14:36:40
Showing 12 changed files
... ...
@@ -209,6 +209,7 @@ function configure_cinder() {
209 209
     inicomment $CINDER_API_PASTE_INI filter:authtoken auth_host
210 210
     inicomment $CINDER_API_PASTE_INI filter:authtoken auth_port
211 211
     inicomment $CINDER_API_PASTE_INI filter:authtoken auth_protocol
212
+    inicomment $CINDER_API_PASTE_INI filter:authtoken cafile
212 213
     inicomment $CINDER_API_PASTE_INI filter:authtoken admin_tenant_name
213 214
     inicomment $CINDER_API_PASTE_INI filter:authtoken admin_user
214 215
     inicomment $CINDER_API_PASTE_INI filter:authtoken admin_password
... ...
@@ -219,6 +220,7 @@ function configure_cinder() {
219 219
     iniset $CINDER_CONF keystone_authtoken auth_host $KEYSTONE_AUTH_HOST
220 220
     iniset $CINDER_CONF keystone_authtoken auth_port $KEYSTONE_AUTH_PORT
221 221
     iniset $CINDER_CONF keystone_authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
222
+    iniset $CINDER_CONF keystone_authtoken cafile $KEYSTONE_SSL_CA
222 223
     iniset $CINDER_CONF keystone_authtoken admin_tenant_name $SERVICE_TENANT_NAME
223 224
     iniset $CINDER_CONF keystone_authtoken admin_user cinder
224 225
     iniset $CINDER_CONF keystone_authtoken admin_password $SERVICE_PASSWORD
... ...
@@ -82,6 +82,7 @@ function configure_glance() {
82 82
     iniset $GLANCE_REGISTRY_CONF keystone_authtoken auth_host $KEYSTONE_AUTH_HOST
83 83
     iniset $GLANCE_REGISTRY_CONF keystone_authtoken auth_port $KEYSTONE_AUTH_PORT
84 84
     iniset $GLANCE_REGISTRY_CONF keystone_authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
85
+    iniset $GLANCE_REGISTRY_CONF keystone_authtoken cafile $KEYSTONE_SSL_CA
85 86
     iniset $GLANCE_REGISTRY_CONF keystone_authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/
86 87
     iniset $GLANCE_REGISTRY_CONF keystone_authtoken admin_tenant_name $SERVICE_TENANT_NAME
87 88
     iniset $GLANCE_REGISTRY_CONF keystone_authtoken admin_user glance
... ...
@@ -99,6 +100,7 @@ function configure_glance() {
99 99
     iniset $GLANCE_API_CONF keystone_authtoken auth_host $KEYSTONE_AUTH_HOST
100 100
     iniset $GLANCE_API_CONF keystone_authtoken auth_port $KEYSTONE_AUTH_PORT
101 101
     iniset $GLANCE_API_CONF keystone_authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
102
+    iniset $GLANCE_API_CONF keystone_authtoken cafile $KEYSTONE_SSL_CA
102 103
     iniset $GLANCE_API_CONF keystone_authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/
103 104
     iniset $GLANCE_API_CONF keystone_authtoken admin_tenant_name $SERVICE_TENANT_NAME
104 105
     iniset $GLANCE_API_CONF keystone_authtoken admin_user glance
... ...
@@ -96,6 +96,7 @@ function configure_heat() {
96 96
     iniset $HEAT_CONF keystone_authtoken auth_port $KEYSTONE_AUTH_PORT
97 97
     iniset $HEAT_CONF keystone_authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
98 98
     iniset $HEAT_CONF keystone_authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0
99
+    iniset $HEAT_CONF keystone_authtoken cafile $KEYSTONE_SSL_CA
99 100
     iniset $HEAT_CONF keystone_authtoken admin_tenant_name $SERVICE_TENANT_NAME
100 101
     iniset $HEAT_CONF keystone_authtoken admin_user heat
101 102
     iniset $HEAT_CONF keystone_authtoken admin_password $SERVICE_PASSWORD
... ...
@@ -98,6 +98,7 @@ function configure_ironic_api() {
98 98
     iniset $IRONIC_CONF_FILE keystone_authtoken auth_host $KEYSTONE_AUTH_HOST
99 99
     iniset $IRONIC_CONF_FILE keystone_authtoken auth_port $KEYSTONE_AUTH_PORT
100 100
     iniset $IRONIC_CONF_FILE keystone_authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
101
+    iniset $IRONIC_CONF_FILE keystone_authtoken cafile $KEYSTONE_SSL_CA
101 102
     iniset $IRONIC_CONF_FILE keystone_authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/
102 103
     iniset $IRONIC_CONF_FILE keystone_authtoken admin_tenant_name $SERVICE_TENANT_NAME
103 104
     iniset $IRONIC_CONF_FILE keystone_authtoken admin_user ironic
... ...
@@ -4,6 +4,7 @@
4 4
 # Dependencies:
5 5
 #
6 6
 # - ``functions`` file
7
+# - ``tls`` file
7 8
 # - ``DEST``, ``STACK_USER``
8 9
 # - ``IDENTITY_API_VERSION``
9 10
 # - ``BASE_SQL_CONN``
... ...
@@ -79,6 +80,13 @@ KEYSTONE_VALID_IDENTITY_BACKENDS=kvs,ldap,pam,sql
79 79
 # valid assignment backends as per dir keystone/identity/backends
80 80
 KEYSTONE_VALID_ASSIGNMENT_BACKENDS=kvs,ldap,sql
81 81
 
82
+# if we are running with SSL use https protocols
83
+if is_ssl_enabled_service "key"; then
84
+    KEYSTONE_AUTH_PROTOCOL="https"
85
+    KEYSTONE_SERVICE_PROTOCOL="https"
86
+fi
87
+
88
+
82 89
 # Functions
83 90
 # ---------
84 91
 # cleanup_keystone() - Remove residual data files, anything left over from previous
... ...
@@ -172,6 +180,15 @@ function configure_keystone() {
172 172
     iniset $KEYSTONE_CONF DEFAULT public_endpoint "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:%(public_port)s/"
173 173
     iniset $KEYSTONE_CONF DEFAULT admin_endpoint "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:%(admin_port)s/"
174 174
 
175
+    # Register SSL certificates if provided
176
+    if is_ssl_enabled_service key; then
177
+        ensure_certificates KEYSTONE
178
+
179
+        iniset $KEYSTONE_CONF ssl enable True
180
+        iniset $KEYSTONE_CONF ssl certfile $KEYSTONE_SSL_CERT
181
+        iniset $KEYSTONE_CONF ssl keyfile $KEYSTONE_SSL_KEY
182
+    fi
183
+
175 184
     if is_service_enabled tls-proxy; then
176 185
         # Set the service ports for a proxy to take the originals
177 186
         iniset $KEYSTONE_CONF DEFAULT public_port $KEYSTONE_SERVICE_PORT_INT
... ...
@@ -386,7 +403,7 @@ function start_keystone() {
386 386
     fi
387 387
 
388 388
     echo "Waiting for keystone to start..."
389
-    if ! timeout $SERVICE_TIMEOUT sh -c "while ! curl --noproxy '*' -s http://$SERVICE_HOST:$service_port/v$IDENTITY_API_VERSION/ >/dev/null; do sleep 1; done"; then
389
+    if ! timeout $SERVICE_TIMEOUT sh -c "while ! curl --noproxy '*' -s $KEYSTONE_AUTH_PROTOCOL://$SERVICE_HOST:$service_port/v$IDENTITY_API_VERSION/ >/dev/null; do sleep 1; done"; then
390 390
         die $LINENO "keystone did not start"
391 391
     fi
392 392
 
... ...
@@ -225,6 +225,7 @@ function configure_nova() {
225 225
         inicomment $NOVA_API_PASTE_INI filter:authtoken auth_host
226 226
         inicomment $NOVA_API_PASTE_INI filter:authtoken auth_protocol
227 227
         inicomment $NOVA_API_PASTE_INI filter:authtoken admin_tenant_name
228
+        inicomment $NOVA_API_PASTE_INI filter:authtoken cafile
228 229
         inicomment $NOVA_API_PASTE_INI filter:authtoken admin_user
229 230
         inicomment $NOVA_API_PASTE_INI filter:authtoken admin_password
230 231
     fi
... ...
@@ -399,6 +400,7 @@ function create_nova_conf() {
399 399
         iniset $NOVA_CONF keystone_authtoken auth_host $KEYSTONE_AUTH_HOST
400 400
         iniset $NOVA_CONF keystone_authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
401 401
         iniset $NOVA_CONF keystone_authtoken admin_tenant_name $SERVICE_TENANT_NAME
402
+        iniset $NOVA_CONF keystone_authtoken cafile $KEYSTONE_SSL_CA
402 403
         iniset $NOVA_CONF keystone_authtoken admin_user nova
403 404
         iniset $NOVA_CONF keystone_authtoken admin_password $SERVICE_PASSWORD
404 405
     fi
... ...
@@ -316,6 +316,7 @@ function configure_swift() {
316 316
     iniset ${SWIFT_CONFIG_PROXY_SERVER} filter:authtoken auth_host $KEYSTONE_AUTH_HOST
317 317
     iniset ${SWIFT_CONFIG_PROXY_SERVER} filter:authtoken auth_port $KEYSTONE_AUTH_PORT
318 318
     iniset ${SWIFT_CONFIG_PROXY_SERVER} filter:authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
319
+    iniset ${SWIFT_CONFIG_PROXY_SERVER} filter:authtoken cafile $KEYSTONE_SSL_CA
319 320
     iniset ${SWIFT_CONFIG_PROXY_SERVER} filter:authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/
320 321
     iniset ${SWIFT_CONFIG_PROXY_SERVER} filter:authtoken admin_tenant_name $SERVICE_TENANT_NAME
321 322
     iniset ${SWIFT_CONFIG_PROXY_SERVER} filter:authtoken admin_user swift
... ...
@@ -339,6 +340,7 @@ paste.filter_factory = keystone.middleware.s3_token:filter_factory
339 339
 auth_port = ${KEYSTONE_AUTH_PORT}
340 340
 auth_host = ${KEYSTONE_AUTH_HOST}
341 341
 auth_protocol = ${KEYSTONE_AUTH_PROTOCOL}
342
+cafile = ${KEYSTONE_SSL_CA}
342 343
 auth_token = ${SERVICE_TOKEN}
343 344
 admin_token = ${SERVICE_TOKEN}
344 345
 
... ...
@@ -22,7 +22,8 @@
22 22
 # - make_int_ca
23 23
 # - new_cert $INT_CA_DIR int-server "abc"
24 24
 # - start_tls_proxy HOST_IP 5000 localhost 5000
25
-
25
+# - ensure_certificates
26
+# - is_ssl_enabled_service
26 27
 
27 28
 # Defaults
28 29
 # --------
... ...
@@ -309,6 +310,53 @@ function make_root_CA() {
309 309
 }
310 310
 
311 311
 
312
+# Certificate Input Configuration
313
+# ===============================
314
+
315
+# check to see if the service(s) specified are to be SSL enabled.
316
+#
317
+# Multiple services specified as arguments are ``OR``'ed together; the test
318
+# is a short-circuit boolean, i.e it returns on the first match.
319
+#
320
+# Uses global ``SSL_ENABLED_SERVICES``
321
+function is_ssl_enabled_service() {
322
+    services=$@
323
+    for service in ${services}; do
324
+        [[ ,${SSL_ENABLED_SERVICES}, =~ ,${service}, ]] && return 0
325
+    done
326
+    return 1
327
+}
328
+
329
+
330
+# Ensure that the certificates for a service are in place. This function does
331
+# not check that a service is SSL enabled, this should already have been
332
+# completed.
333
+#
334
+# The function expects to find a certificate, key and CA certificate in the
335
+# variables {service}_SSL_CERT, {service}_SSL_KEY and {service}_SSL_CA. For
336
+# example for keystone this would be KEYSTONE_SSL_CERT, KEYSTONE_SSL_KEY and
337
+# KEYSTONE_SSL_CA. If it does not find these certificates the program will
338
+# quit.
339
+function ensure_certificates() {
340
+    local service=$1
341
+
342
+    local cert_var="${service}_SSL_CERT"
343
+    local key_var="${service}_SSL_KEY"
344
+    local ca_var="${service}_SSL_CA"
345
+
346
+    local cert=${!cert_var}
347
+    local key=${!key_var}
348
+    local ca=${!ca_var}
349
+
350
+    if [[ !($cert && $key && $ca) ]]; then
351
+        die $LINENO "Missing either the ${cert_var} ${key_var} or ${ca_var}" \
352
+                    "variable to enable SSL for ${service}"
353
+    fi
354
+
355
+    cat $ca >> $SSL_BUNDLE_FILE
356
+}
357
+
358
+
312 359
 # Proxy Functions
313 360
 # ===============
314 361
 
... ...
@@ -29,7 +29,6 @@ TROVE_DIR=$DEST/trove
29 29
 TROVECLIENT_DIR=$DEST/python-troveclient
30 30
 TROVE_CONF_DIR=/etc/trove
31 31
 TROVE_LOCAL_CONF_DIR=$TROVE_DIR/etc/trove
32
-TROVE_AUTH_ENDPOINT=$KEYSTONE_AUTH_PROTOCOL://$KEYSTONE_AUTH_HOST:$KEYSTONE_AUTH_PORT//v$IDENTITY_API_VERSION
33 32
 TROVE_AUTH_CACHE_DIR=${TROVE_AUTH_CACHE_DIR:-/var/cache/trove}
34 33
 TROVE_BIN_DIR=/usr/local/bin
35 34
 
... ...
@@ -102,6 +101,7 @@ function configure_trove() {
102 102
     iniset $TROVE_API_PASTE_INI filter:tokenauth auth_host $KEYSTONE_AUTH_HOST
103 103
     iniset $TROVE_API_PASTE_INI filter:tokenauth auth_port $KEYSTONE_AUTH_PORT
104 104
     iniset $TROVE_API_PASTE_INI filter:tokenauth auth_protocol $KEYSTONE_AUTH_PROTOCOL
105
+    iniset $TROVE_API_PASTE_INI filter:tokenauth cafile $KEYSTONE_SSL_CA
105 106
     iniset $TROVE_API_PASTE_INI filter:tokenauth admin_tenant_name $SERVICE_TENANT_NAME
106 107
     iniset $TROVE_API_PASTE_INI filter:tokenauth admin_user trove
107 108
     iniset $TROVE_API_PASTE_INI filter:tokenauth admin_password $SERVICE_PASSWORD
... ...
@@ -123,6 +123,8 @@ function configure_trove() {
123 123
 
124 124
     # (Re)create trove taskmanager conf file if needed
125 125
     if is_service_enabled tr-tmgr; then
126
+        TROVE_AUTH_ENDPOINT=$KEYSTONE_AUTH_PROTOCOL://$KEYSTONE_AUTH_HOST:$KEYSTONE_AUTH_PORT//v$IDENTITY_API_VERSION
127
+
126 128
         iniset $TROVE_CONF_DIR/trove-taskmanager.conf DEFAULT rabbit_password $RABBIT_PASSWORD
127 129
         iniset $TROVE_CONF_DIR/trove-taskmanager.conf DEFAULT sql_connection `database_connection_url trove`
128 130
         iniset $TROVE_CONF_DIR/trove-taskmanager.conf DEFAULT taskmanager_manager trove.taskmanager.manager.Manager
... ...
@@ -58,6 +58,7 @@ export OS_NO_CACHE=${OS_NO_CACHE:-1}
58 58
 HOST_IP=${HOST_IP:-127.0.0.1}
59 59
 SERVICE_HOST=${SERVICE_HOST:-$HOST_IP}
60 60
 SERVICE_PROTOCOL=${SERVICE_PROTOCOL:-http}
61
+KEYSTONE_AUTH_PROTOCOL=${KEYSTONE_AUTH_PROTOCOL:-$SERVICE_PROTOCOL}
61 62
 
62 63
 # Some exercises call glance directly.  On a single-node installation, Glance
63 64
 # should be listening on HOST_IP.  If its running elsewhere, it can be set here
... ...
@@ -71,10 +72,10 @@ export OS_IDENTITY_API_VERSION=${IDENTITY_API_VERSION:-2.0}
71 71
 # the user/tenant has access to - including nova, glance, keystone, swift, ...
72 72
 # We currently recommend using the 2.0 *identity api*.
73 73
 #
74
-export OS_AUTH_URL=$SERVICE_PROTOCOL://$SERVICE_HOST:5000/v${OS_IDENTITY_API_VERSION}
74
+export OS_AUTH_URL=$KEYSTONE_AUTH_PROTOCOL://$SERVICE_HOST:5000/v${OS_IDENTITY_API_VERSION}
75 75
 
76 76
 # Set the pointer to our CA certificate chain.  Harmless if TLS is not used.
77
-export OS_CACERT=$INT_CA_DIR/ca-chain.pem
77
+export OS_CACERT=${OS_CACERT:-$INT_CA_DIR/ca-chain.pem}
78 78
 
79 79
 # Currently novaclient needs you to specify the *compute api* version.  This
80 80
 # needs to match the config of your catalog returned by Keystone.
... ...
@@ -290,6 +290,10 @@ LOG_COLOR=`trueorfalse True $LOG_COLOR`
290 290
 # Service startup timeout
291 291
 SERVICE_TIMEOUT=${SERVICE_TIMEOUT:-60}
292 292
 
293
+# Reset the bundle of CA certificates
294
+SSL_BUNDLE_FILE="$DATA_DIR/ca-bundle.pem"
295
+rm -f $SSL_BUNDLE_FILE
296
+
293 297
 
294 298
 # Configure Projects
295 299
 # ==================
... ...
@@ -799,6 +803,17 @@ fi
799 799
 restart_rpc_backend
800 800
 
801 801
 
802
+# Export Certicate Authority Bundle
803
+# ---------------------------------
804
+
805
+# If certificates were used and written to the SSL bundle file then these
806
+# should be exported so clients can validate their connections.
807
+
808
+if [ -f $SSL_BUNDLE_FILE ]; then
809
+    export OS_CACERT=$SSL_BUNDLE_FILE
810
+fi
811
+
812
+
802 813
 # Configure database
803 814
 # ------------------
804 815
 
... ...
@@ -1146,6 +1161,7 @@ if is_service_enabled trove; then
1146 1146
     start_trove
1147 1147
 fi
1148 1148
 
1149
+
1149 1150
 # Create account rc files
1150 1151
 # =======================
1151 1152
 
... ...
@@ -1154,7 +1170,13 @@ fi
1154 1154
 # which is helpful in image bundle steps.
1155 1155
 
1156 1156
 if is_service_enabled nova && is_service_enabled key; then
1157
-    $TOP_DIR/tools/create_userrc.sh -PA --target-dir $TOP_DIR/accrc
1157
+    USERRC_PARAMS="-PA --target-dir $TOP_DIR/accrc"
1158
+
1159
+    if [ -f $SSL_BUNDLE_FILE ]; then
1160
+        USERRC_PARAMS="$USERRC_PARAMS --os-cacert $SSL_BUNDLE_FILE"
1161
+    fi
1162
+
1163
+    $TOP_DIR/tools/create_userrc.sh $USERRC_PARAMS
1158 1164
 fi
1159 1165
 
1160 1166
 
... ...
@@ -1230,7 +1252,7 @@ fi
1230 1230
 CURRENT_RUN_TIME=$(date "+$TIMESTAMP_FORMAT")
1231 1231
 echo "# $CURRENT_RUN_TIME" >$TOP_DIR/.stackenv
1232 1232
 for i in BASE_SQL_CONN ENABLED_SERVICES HOST_IP LOGFILE \
1233
-    SERVICE_HOST SERVICE_PROTOCOL STACK_USER TLS_IP; do
1233
+    SERVICE_HOST SERVICE_PROTOCOL STACK_USER TLS_IP KEYSTONE_AUTH_PROTOCOL OS_CACERT; do
1234 1234
     echo $i=${!i} >>$TOP_DIR/.stackenv
1235 1235
 done
1236 1236
 
... ...
@@ -43,6 +43,7 @@ Optional Arguments
43 43
 --os-tenant-name <tenant_name>
44 44
 --os-tenant-id <tenant_id>
45 45
 --os-auth-url <auth_url>
46
+--os-cacert <cert file>
46 47
 --target-dir <target_directory>
47 48
 --skip-tenant <tenant-name>
48 49
 --debug
... ...
@@ -53,7 +54,7 @@ $0 -P -C mytenant -u myuser -p mypass
53 53
 EOF
54 54
 }
55 55
 
56
-if ! options=$(getopt -o hPAp:u:r:C: -l os-username:,os-password:,os-tenant-name:,os-tenant-id:,os-auth-url:,target-dir:,skip-tenant:,help,debug -- "$@")
56
+if ! options=$(getopt -o hPAp:u:r:C: -l os-username:,os-password:,os-tenant-name:,os-tenant-id:,os-auth-url:,target-dir:,skip-tenant:,os-cacert:,help,debug -- "$@")
57 57
 then
58 58
     #parse error
59 59
     display_help
... ...
@@ -80,6 +81,7 @@ do
80 80
     --os-tenant-id) export OS_TENANT_ID=$2; shift ;;
81 81
     --skip-tenant) SKIP_TENANT="$SKIP_TENANT$2,"; shift ;;
82 82
     --os-auth-url) export OS_AUTH_URL=$2; shift ;;
83
+    --os-cacert) export OS_CACERT=$2; shift ;;
83 84
     --target-dir) ACCOUNT_DIR=$2; shift ;;
84 85
     --debug) set -o xtrace ;;
85 86
     -u) MODE=${MODE:-one};  USER_NAME=$2; shift ;;
... ...
@@ -201,6 +203,7 @@ export OS_USERNAME="$user_name"
201 201
 # Openstack Tenant ID = $tenant_id
202 202
 export OS_TENANT_NAME="$tenant_name"
203 203
 export OS_AUTH_URL="$OS_AUTH_URL"
204
+export OS_CACERT="$OS_CACERT"
204 205
 export EC2_CERT="$ec2_cert"
205 206
 export EC2_PRIVATE_KEY="$ec2_private_key"
206 207
 export EC2_USER_ID=42 #not checked by nova (can be a 12-digit id)