Changeset - 052eefc4fab0
[Not reviewed]
0 3 15
Branko Majic (branko) - 10 years ago 2015-05-31 16:52:57
branko@majic.rs
MAR-5: Ignore certificate and key files in TLS sub-directory (include GnuTLS templates). Updated test site docs to describe all playbooks. Updated test site set-up instructions to include sample commands for generating the keys/certs. Added two roles to test site for deploying simple PHP/WSGI websites.
18 files changed with 333 insertions and 12 deletions:
0 comments (0 inline, 0 general)
.gitignore
Show inline comments
 
@@ -3,4 +3,5 @@
 
tmp/
 
docs/_build/
 
testsite/preseed_files/
 
testsite/tls/
 
testsite/tls/*.pem
 
testsite/tls/*.key
docs/testsite.rst
Show inline comments
 
@@ -29,6 +29,9 @@ bootstrap.yml (for bootstrapping fresh nodes)
 
ldap.yml
 
  This playbook sets-up the LDAP servers. It is included in ``site.yml``.
 

	
 
mail.yml
 
  This playbook sets-up the mail server. It is included in ``site.yml``.
 

	
 
preseed.yml
 
  This playbook sets-up the Debian preseed files. It is included in
 
  ``site.yml``.
 
@@ -36,16 +39,46 @@ preseed.yml
 
site.yml
 
  This playbook sets-up all servers, including preseed files on local host.
 

	
 
web.yml
 
  This playbook sets-up the web server. It is included in ``site.yml``.
 

	
 
xmpp.yml
 
  This playbook sets-up the XMPP server. It is included in ``site.yml``.
 

	
 
In order to deploy the test site, the following steps would normally be taken:
 

	
 
1. Create TLS private keys (relative to top level directory):
 
1. If you do not wish to have the hassle of creating the private keys and
 
   issuing certificates, run the following commands to get this done for you
 
   automatically, and skip to step 5 (otherwise follow steps 2 through 4):
 

	
 
   .. code-block:: shell
 

	
 
     certtool --sec-param high --generate-privkey --outfile tls/example_ca.key
 
     certtool --template tls/templates/example_ca.cfg --generate-self-signed --load-privkey tls/example_ca.key --outfile tls/example_ca.pem
 
     cp tls/example_ca.pem tls/example_ca_chain.pem
 
     for template in tls/templates/*.cfg; do
 
         entity_basename="$(basename "$template" .cfg)"
 
         [[ $entity_basename == example_ca ]] && continue
 
         certtool --sec-param normal --generate-privkey --outfile "tls/$entity_basename.key"
 
         certtool --generate-certificate \
 
           --load-ca-privkey "tls/example_ca.key" \
 
           --load-ca-certificate "tls/example_ca.pem" \
 
           --template "$template" \
 
           --load-privkey "tls/${entity_basename}.key" \
 
           --outfile "tls/${entity_basename}.pem"
 
     done
 

	
 
2. Create TLS private keys (relative to top level directory):
 

	
 
   - ``testsite/tls/mail.example.com_imap.key``
 
   - ``testsite/tls/mail.example.com_smtp.key``
 
   - ``testsite/tls/xmpp.example.com_xmpp.key``
 
   - ``testsite/tls/ldap.example.com_ldap.key``
 
   - ``testsite/tls/web.example.com_https.key``
 
   - ``testsite/tls/phpfino.example.com_https.key``
 
   - ``testsite/tls/wsgi.example.com_https.key``
 

	
 
2. Issue TLS certificates corresponding to the generated TLS private keys (make
 
3. Issue TLS certificates corresponding to the generated TLS private keys (make
 
   sure to use correct FQDN for DNS subject alternative name):
 

	
 
   - ``testsite/tls/mail.example.com_imap.pem`` (subject alternative name should
 
@@ -56,36 +89,44 @@ In order to deploy the test site, the following steps would normally be taken:
 
     be ``xmpp.example.com``)
 
   - ``testsite/tls/ldap.example.com_ldap.pem`` (subject alternative name should
 
     be ``ldap.example.com``)
 

	
 
3. Create ``PEM`` truststore file which contains all CA certificates that form
 
   - ``testsite/tls/web.example.com_https.pem`` (subject alternative name should
 
     be ``web.example.com``)
 
   - ``testsite/tls/web.example.com_https.pem`` (subject alternative name should
 
     be ``web.example.com``)
 
   - ``testsite/tls/phpinffo.example.com_https.pem`` (subject alternative name
 
     should be ``phpinfo.example.com``)
 
   - ``testsite/tls/wsgi.example.com_https.pem`` (subject alternative name
 
     should be ``wsgi.example.com``)
 

	
 
4. Create ``PEM`` truststore file which contains all CA certificates that form
 
   CA chain for the issued end entity certificates from previous step at
 
   location ``testsite/tls/example_ca_chain.pem``. It is very important to
 
   include the CA chain used for LDAP server.
 

	
 
4. Generate the preseed files:
 
5. Generate the preseed files:
 

	
 
  .. code-block:: shell
 

	
 
    ansible-playbook playbooks/preseed.yml
 

	
 
5. Install all servers using the generated preseed files.
 
6. Install all servers using the generated preseed files.
 

	
 
6. Add the SSH host fingerprints to your ``known_hosts`` file (don't forget to
 
7. Add the SSH host fingerprints to your ``known_hosts`` file (don't forget to
 
   remove old entries if you are redoing the process). You can easily obtain all
 
   the necessary fingerprints with command:
 

	
 
   .. code-block:: shell
 

	
 
      ssh-keyscan mail.example.com ldap.example.com xmpp.example.com
 
      ssh-keyscan mail.example.com ldap.example.com xmpp.example.com web.example.com
 

	
 
7. Invoke the ``bootstrap.yml`` playbook in order to set-up some basic
 
8. Invoke the ``bootstrap.yml`` playbook in order to set-up some basic
 
   environment for Ansible runs on all servers:
 

	
 
  .. code-block:: shell
 

	
 
    ansible-playbook playbooks/bootstrap.yml
 

	
 
8. Finally, apply configuration on all servers:
 
9. Finally, apply configuration on all servers:
 

	
 
  .. code-block:: shell
 

	
testsite/playbooks/roles/phpinfo/files/index.php
Show inline comments
 
new file 100644
 
<?php
 

	
 
phpinfo();
 

	
 
?>
 
\ No newline at end of file
testsite/playbooks/roles/phpinfo/meta/main.yml
Show inline comments
 
new file 100644
 
---
 

	
 
dependencies:
 
  - role: php_website
 
    admin: admin
 
    fqdn: phpinfo.example.com
 
    php_rewrite_urls:
 
      - ^(.*) /index.php
 
    uid: 2000
 
    https_tls_key: "{{ inventory_dir }}/tls/phpinfo.example.com_https.key"
 
    https_tls_certificate: "{{ inventory_dir }}/tls/phpinfo.example.com_https.pem"
testsite/playbooks/roles/phpinfo/tasks/main.yml
Show inline comments
 
new file 100644
 
---
 

	
 
- name: Create directory for hosting the application
 
  file: dest="/var/www/phpinfo.example.com/htdocs/" state=directory
 
        owner="admin" group="web-phpinfo_example_com" mode=2750
 

	
 
- name: Deploy the index.php
 
  copy: src="index.php" dest="/var/www/phpinfo.example.com/htdocs/index.php"
 
        owner="admin" group="web-phpinfo_example_com" mode=640
testsite/playbooks/roles/wsgihello/defaults/main.yml
Show inline comments
 
new file 100644
 
---
 

	
 
#fqdn: wsgi.example.com
 
\ No newline at end of file
testsite/playbooks/roles/wsgihello/files/hello.wsgi
Show inline comments
 
new file 100644
 
#!/usr/bin/env python
 

	
 
def application(environ, start_response):
 
    status = '200 OK'
 
    output = 'Hello, world one!'
 

	
 
    response_headers = [('Content-type', 'text/plain'),
 
                        ('Content-Length', str(len(output)))]
 
    start_response(status, response_headers)
 

	
 
    return [output]
testsite/playbooks/roles/wsgihello/meta/main.yml
Show inline comments
 
new file 100644
 
---
 

	
 
dependencies:
 
  - role: wsgi_website
 
    admin: admin
 
    fqdn: wsgi.example.com
 
    uid: 2001
 
    wsgi_application: wsgi:application
 
    static_locations:
 
      - /static/
 
    https_tls_key: "{{ inventory_dir }}/tls/wsgi.example.com_https.key"
 
    https_tls_certificate: "{{ inventory_dir }}/tls/wsgi.example.com_https.pem"
testsite/playbooks/roles/wsgihello/tasks/main.yml
Show inline comments
 
new file 100644
 
---
 

	
 
- name: Create directroy for storing code
 
  file: dest="/var/www/wsgi.example.com/code/" state=directory
 
        owner="admin" group="web-wsgi_example_com" mode=2750
 

	
 
- name: Deploy WSGI application
 
  copy: src="hello.wsgi" dest="/var/www/wsgi.example.com/code/wsgi.py"
 
        owner="admin" group="web-wsgi_example_com" mode=640
 
  notify:
 
    - Restart website wsgi.example.com
 
\ No newline at end of file
testsite/playbooks/web.yml
Show inline comments
 
@@ -7,4 +7,6 @@
 
    - common
 
    - ldap_client
 
    - mail_forwarder
 
    - web_server
 
\ No newline at end of file
 
    - web_server
 
    - phpinfo
 
    - wsgihello
testsite/tls/templates/example_ca.cfg
Show inline comments
 
new file 100644
 
# X.509 Certificate options
 
#
 
# DN options
 

	
 
# The organization of the subject.
 
organization = "Example Inc."
 

	
 
# The country of the subject. Two letter code.
 
country = "SE"
 

	
 
# The common name of the certificate owner.
 
cn = "Example Inc. Test Site CA"
 

	
 
# In how many days, counting from today, this certificate will expire.
 
expiration_days = 1825
 

	
 
# X.509 v3 extensions
 

	
 
# Whether this is a CA certificate or not
 
ca
 

	
 
# Whether this key will be used to sign other certificates.
 
cert_signing_key
 

	
 
# Whether this key will be used to sign CRLs.
 
crl_signing_key
testsite/tls/templates/ldap.example.com_ldap.cfg
Show inline comments
 
new file 100644
 
# X.509 Certificate options
 
#
 
# DN options
 

	
 
# The organization of the subject.
 
organization = "Example Inc."
 

	
 
# The country of the subject. Two letter code.
 
country = SE
 

	
 
# The common name of the certificate owner.
 
cn = "Exampe Inc. LDAP Server"
 

	
 
# In how many days, counting from today, this certificate will expire.
 
expiration_days = 365
 

	
 
# X.509 v3 extensions
 

	
 
# A dnsname in case of a WWW server.
 
dns_name = "ldap.example.com"
 

	
 
# Whether this certificate will be used for a TLS server
 
tls_www_server
 

	
 
# Whether this certificate will be used to sign data (needed
 
# in TLS DHE ciphersuites).
 
signing_key
testsite/tls/templates/mail.example.com_imap.cfg
Show inline comments
 
new file 100644
 
# X.509 Certificate options
 
#
 
# DN options
 

	
 
# The organization of the subject.
 
organization = "Example Inc."
 

	
 
# The country of the subject. Two letter code.
 
country = SE
 

	
 
# The common name of the certificate owner.
 
cn = "Exampe Inc. IMAP Server"
 

	
 
# In how many days, counting from today, this certificate will expire.
 
expiration_days = 365
 

	
 
# X.509 v3 extensions
 

	
 
# A dnsname in case of a WWW server.
 
dns_name = "mail.example.com"
 

	
 
# Whether this certificate will be used for a TLS server
 
tls_www_server
 

	
 
# Whether this certificate will be used to sign data (needed
 
# in TLS DHE ciphersuites).
 
signing_key
testsite/tls/templates/mail.example.com_smtp.cfg
Show inline comments
 
new file 100644
 
# X.509 Certificate options
 
#
 
# DN options
 

	
 
# The organization of the subject.
 
organization = "Example Inc."
 

	
 
# The country of the subject. Two letter code.
 
country = SE
 

	
 
# The common name of the certificate owner.
 
cn = "Exampe Inc. SMTP Server"
 

	
 
# In how many days, counting from today, this certificate will expire.
 
expiration_days = 365
 

	
 
# X.509 v3 extensions
 

	
 
# A dnsname in case of a WWW server.
 
dns_name = "mail.example.com"
 

	
 
# Whether this certificate will be used for a TLS server
 
tls_www_server
 

	
 
# Whether this certificate will be used to sign data (needed
 
# in TLS DHE ciphersuites).
 
signing_key
testsite/tls/templates/phpinfo.example.com_https.cfg
Show inline comments
 
new file 100644
 
# X.509 Certificate options
 
#
 
# DN options
 

	
 
# The organization of the subject.
 
organization = "Example Inc."
 

	
 
# The country of the subject. Two letter code.
 
country = SE
 

	
 
# The common name of the certificate owner.
 
cn = "Exampe Inc. PHP Info Server"
 

	
 
# In how many days, counting from today, this certificate will expire.
 
expiration_days = 365
 

	
 
# X.509 v3 extensions
 

	
 
# A dnsname in case of a WWW server.
 
dns_name = "phpinfo.example.com"
 

	
 
# Whether this certificate will be used for a TLS server
 
tls_www_server
 

	
 
# Whether this certificate will be used to sign data (needed
 
# in TLS DHE ciphersuites).
 
signing_key
testsite/tls/templates/web.example.com_https.cfg
Show inline comments
 
new file 100644
 
# X.509 Certificate options
 
#
 
# DN options
 

	
 
# The organization of the subject.
 
organization = "Example Inc."
 

	
 
# The country of the subject. Two letter code.
 
country = SE
 

	
 
# The common name of the certificate owner.
 
cn = "Exampe Inc. Web Server"
 

	
 
# In how many days, counting from today, this certificate will expire.
 
expiration_days = 365
 

	
 
# X.509 v3 extensions
 

	
 
# A dnsname in case of a WWW server.
 
dns_name = "web.example.com"
 

	
 
# Whether this certificate will be used for a TLS server
 
tls_www_server
 

	
 
# Whether this certificate will be used to sign data (needed
 
# in TLS DHE ciphersuites).
 
signing_key
testsite/tls/templates/wsgi.example.com_https.cfg
Show inline comments
 
new file 100644
 
# X.509 Certificate options
 
#
 
# DN options
 

	
 
# The organization of the subject.
 
organization = "Example Inc."
 

	
 
# The country of the subject. Two letter code.
 
country = SE
 

	
 
# The common name of the certificate owner.
 
cn = "Exampe Inc. WSGI Hello World Server"
 

	
 
# In how many days, counting from today, this certificate will expire.
 
expiration_days = 365
 

	
 
# X.509 v3 extensions
 

	
 
# A dnsname in case of a WWW server.
 
dns_name = "wsgi.example.com"
 

	
 
# Whether this certificate will be used for a TLS server
 
tls_www_server
 

	
 
# Whether this certificate will be used to sign data (needed
 
# in TLS DHE ciphersuites).
 
signing_key
testsite/tls/templates/xmpp.example.com_xmpp.cfg
Show inline comments
 
new file 100644
 
# X.509 Certificate options
 
#
 
# DN options
 

	
 
# The organization of the subject.
 
organization = "Example Inc."
 

	
 
# The country of the subject. Two letter code.
 
country = SE
 

	
 
# The common name of the certificate owner.
 
cn = "Exampe Inc. XMPP Server"
 

	
 
# In how many days, counting from today, this certificate will expire.
 
expiration_days = 365
 

	
 
# X.509 v3 extensions
 

	
 
# A dnsname in case of a WWW server.
 
dns_name = "xmpp.example.com"
 

	
 
# Whether this certificate will be used for a TLS server
 
tls_www_server
 

	
 
# Whether this certificate will be used to sign data (needed
 
# in TLS DHE ciphersuites).
 
signing_key
0 comments (0 inline, 0 general)