Project

General

Profile

PT-TLS SWIMA Server » History » Version 11

Andreas Steffen, 07.07.2017 20:49

1 1 Andreas Steffen
h1. PT-TLS SWIMA Server
2 1 Andreas Steffen
3 9 Andreas Steffen
{{>toc}}
4 9 Andreas Steffen
5 1 Andreas Steffen
h2. Installing the strongSwan TNC Software
6 1 Andreas Steffen
7 1 Andreas Steffen
First we have to install some additional Ubuntu packages needed for the strongSwan TNC build
8 1 Andreas Steffen
<pre>
9 2 Andreas Steffen
 sudo apt install libsystemd-dev libssl-dev libcurl4-openssl-dev sqlite3 libsqlite3-dev libjson0-dev
10 1 Andreas Steffen
</pre>
11 1 Andreas Steffen
12 1 Andreas Steffen
Download the lastest strongSwan tarball
13 1 Andreas Steffen
<pre>
14 1 Andreas Steffen
wget https://download.strongswan.org/strongswan-5.6.0dr1.tar.bz2
15 1 Andreas Steffen
</pre>
16 1 Andreas Steffen
17 1 Andreas Steffen
Unpack the tarball
18 1 Andreas Steffen
<pre>
19 1 Andreas Steffen
tar xf strongswan-5.6.0dr1.tar.bz2
20 1 Andreas Steffen
</pre>
21 1 Andreas Steffen
22 1 Andreas Steffen
and change into the strongSwan build directory
23 1 Andreas Steffen
<pre>
24 1 Andreas Steffen
cd strongswan-5.6.0dr1
25 1 Andreas Steffen
</pre>
26 1 Andreas Steffen
27 1 Andreas Steffen
Configure strongSwan with the following options
28 1 Andreas Steffen
<pre>
29 1 Andreas Steffen
./configure --prefix=/usr --sysconfdir=/etc --disable-gmp --enable-openssl --enable-tnc-imv --enable-tnc-pdp --enable-tnccs-20 --enable-imv-os --enable-imv-swima --enable-sqlite --enable-curl --disable-stroke --enable-swanctl --enable-systemd
30 1 Andreas Steffen
</pre>
31 1 Andreas Steffen
32 1 Andreas Steffen
Build and install strongSwan with the commands
33 1 Andreas Steffen
<pre>
34 1 Andreas Steffen
make; sudo make install
35 1 Andreas Steffen
</pre>
36 3 Andreas Steffen
37 7 Andreas Steffen
The following TNC server options have to be configured in /etc/strongswan.conf
38 7 Andreas Steffen
<pre>
39 7 Andreas Steffen
charon-systemd {
40 7 Andreas Steffen
  journal {
41 7 Andreas Steffen
    default = 1
42 7 Andreas Steffen
    tnc = 2
43 7 Andreas Steffen
    imv = 3
44 7 Andreas Steffen
    pts = 2
45 7 Andreas Steffen
  }
46 7 Andreas Steffen
  syslog {
47 7 Andreas Steffen
    auth {
48 7 Andreas Steffen
      default = 0
49 7 Andreas Steffen
    }
50 7 Andreas Steffen
  }
51 7 Andreas Steffen
  plugins {
52 7 Andreas Steffen
    tnccs-20 {
53 7 Andreas Steffen
      max_batch_size = 131056
54 7 Andreas Steffen
      max_message_size = 131024
55 7 Andreas Steffen
    }
56 7 Andreas Steffen
    tnc-pdp {
57 7 Andreas Steffen
      server = tnc.example.org
58 7 Andreas Steffen
      pt_tls {
59 7 Andreas Steffen
        enable = yes
60 7 Andreas Steffen
      }
61 7 Andreas Steffen
      radius {
62 7 Andreas Steffen
        enable = no
63 7 Andreas Steffen
      }
64 7 Andreas Steffen
    }
65 7 Andreas Steffen
  }
66 7 Andreas Steffen
}
67 7 Andreas Steffen
68 7 Andreas Steffen
libtls {
69 7 Andreas Steffen
  suites = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
70 7 Andreas Steffen
}
71 7 Andreas Steffen
72 7 Andreas Steffen
libimcv {
73 7 Andreas Steffen
  database = sqlite:///etc/pts/config.db
74 7 Andreas Steffen
  policy_script = ipsec imv_policy_manager
75 7 Andreas Steffen
  plugins {
76 7 Andreas Steffen
    imv-swima {
77 7 Andreas Steffen
      rest_api {
78 7 Andreas Steffen
        uri = https://admin-user:ietf99hackathon@tnc.example.com/api/
79 7 Andreas Steffen
        timeout = 360
80 7 Andreas Steffen
      }
81 7 Andreas Steffen
    }
82 7 Andreas Steffen
  }
83 7 Andreas Steffen
}
84 7 Andreas Steffen
</pre>
85 7 Andreas Steffen
86 11 Andreas Steffen
h2. Setting up a CA using the strongSwan "pki" Tool
87 3 Andreas Steffen
88 6 Andreas Steffen
The strongSwan *pki* tool is very powerful and easy to use. First we create a directory where all keys and certificates are going to be stored
89 3 Andreas Steffen
<pre>
90 3 Andreas Steffen
  sudo -s
91 3 Andreas Steffen
  mkdir /etc/pts
92 3 Andreas Steffen
  mkdir /etc/pts/pki
93 3 Andreas Steffen
  cd /etc/pts/pki
94 3 Andreas Steffen
</pre>
95 3 Andreas Steffen
96 3 Andreas Steffen
Then we generate an ECC public key pair for the Root CA and a matching self-signed CA certificate
97 3 Andreas Steffen
<pre>
98 3 Andreas Steffen
pki --gen --type ecdsa --size 256 --outform pem > caKey.pem
99 3 Andreas Steffen
pki --self --ca --in caKey.pem --type ecdsa --dn "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA" --lifetime 3652 --outform pem > caCert.pem
100 3 Andreas Steffen
</pre>
101 3 Andreas Steffen
102 3 Andreas Steffen
The CA certificate can be listed with the following command
103 3 Andreas Steffen
<pre>
104 3 Andreas Steffen
pki --print --in caCert.pem
105 3 Andreas Steffen
  subject:  "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
106 3 Andreas Steffen
  issuer:   "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
107 3 Andreas Steffen
  validity:  not before Jul 07 08:19:08 2017, ok
108 3 Andreas Steffen
             not after  Jul 07 08:19:08 2027, ok (expires in 3651 days)
109 3 Andreas Steffen
  serial:    3a:98:52:2e:75:a5:a5:8b
110 3 Andreas Steffen
  flags:     CA CRLSign self-signed
111 3 Andreas Steffen
  subjkeyId: 81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
112 3 Andreas Steffen
  pubkey:    ECDSA 256 bits
113 3 Andreas Steffen
  keyid:     85:94:42:42:d7:40:83:17:98:72:7f:d7:6b:4a:08:51:e8:5b:e0:63
114 3 Andreas Steffen
  subjkey:   81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
115 3 Andreas Steffen
</pre>
116 4 Andreas Steffen
117 4 Andreas Steffen
<pre>
118 4 Andreas Steffen
pki --req --in serverKey.pem --type ecdsa --dn "C=CZ, O=IETF, OU=SACM, CN=TNC Server" --san "tnc.example.com" --outform pem > serverReq.pem
119 4 Andreas Steffen
</pre>
120 4 Andreas Steffen
121 4 Andreas Steffen
<pre>
122 4 Andreas Steffen
pki --issue --cakey caKey.pem --cacert caCert.pem --in serverReq.pem --type pkcs10 --flag serverAuth --lifetime 1461 --outform pem > serverCert.pem
123 4 Andreas Steffen
</pre>
124 4 Andreas Steffen
125 4 Andreas Steffen
<pre>
126 4 Andreas Steffen
pki --print --in serverCert.pem
127 4 Andreas Steffen
  subject:  "C=CZ, O=IETF, OU=SACM, CN=TNC Server"
128 4 Andreas Steffen
  issuer:   "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
129 4 Andreas Steffen
  validity:  not before Jul 07 09:07:31 2017, ok
130 4 Andreas Steffen
             not after  Jul 07 09:07:31 2021, ok (expires in 1460 days)
131 4 Andreas Steffen
  serial:    40:53:6a:88:f5:52:50:3b
132 4 Andreas Steffen
  altNames:  tnc.example.com
133 4 Andreas Steffen
  flags:     serverAuth
134 4 Andreas Steffen
  authkeyId: 81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
135 4 Andreas Steffen
  subjkeyId: 9c:83:b7:e9:0a:7d:dd:08:1f:2d:c5:c6:cc:63:c0:3f:96:57:a2:ce
136 4 Andreas Steffen
  pubkey:    ECDSA 256 bits
137 4 Andreas Steffen
  keyid:     15:91:40:5f:55:58:1f:9c:18:c1:89:6d:47:7c:bd:50:3d:b4:90:a1
138 4 Andreas Steffen
  subjkey:   9c:83:b7:e9:0a:7d:dd:08:1f:2d:c5:c6:cc:63:c0:3f:96:57:a2:ce
139 1 Andreas Steffen
</pre>
140 4 Andreas Steffen
141 6 Andreas Steffen
The server key and the server and CA certificates are needed by the strongSwan TNC server and are therefore copied to the default locations.
142 5 Andreas Steffen
<pre>
143 5 Andreas Steffen
cp caCert.pem /etc/swanctl/x509ca
144 5 Andreas Steffen
cp serverCert.pem /etc/swanctl/x509
145 5 Andreas Steffen
cp serverKey.pem /etc/swanctl/ecdsa
146 5 Andreas Steffen
</pre>
147 8 Andreas Steffen
Right after installation the strongSwan TNC daemon has to be enabled and started as a systemd service with the following commands
148 8 Andreas Steffen
<pre>
149 8 Andreas Steffen
sudo systemctl enable strongswan-swanctl
150 8 Andreas Steffen
sudo systemctl start strongswan-swanctl
151 8 Andreas Steffen
</pre>
152 8 Andreas Steffen
153 8 Andreas Steffen
In all subsequent reboots the *strongswan-swanctl* service will be started automatically. The following *swanctl* command shows that the service is running and that the certificates and keys have been loaded
154 8 Andreas Steffen
<pre>
155 8 Andreas Steffen
 swanctl --list-certs
156 8 Andreas Steffen
157 8 Andreas Steffen
List of X.509 End Entity Certificates
158 8 Andreas Steffen
159 8 Andreas Steffen
  subject:  "C=CZ, O=IETF, OU=SACM, CN=TNC Server"
160 8 Andreas Steffen
  issuer:   "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
161 8 Andreas Steffen
  validity:  not before Jul 07 09:07:31 2017, ok
162 8 Andreas Steffen
             not after  Jul 07 09:07:31 2021, ok (expires in 1460 days)
163 8 Andreas Steffen
  serial:    40:53:6a:88:f5:52:50:3b
164 8 Andreas Steffen
  altNames:  tnc.example.com
165 8 Andreas Steffen
  flags:     serverAuth
166 8 Andreas Steffen
  authkeyId: 81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
167 8 Andreas Steffen
  subjkeyId: 9c:83:b7:e9:0a:7d:dd:08:1f:2d:c5:c6:cc:63:c0:3f:96:57:a2:ce
168 8 Andreas Steffen
  pubkey:    ECDSA 256 bits, has private key
169 8 Andreas Steffen
  keyid:     15:91:40:5f:55:58:1f:9c:18:c1:89:6d:47:7c:bd:50:3d:b4:90:a1
170 8 Andreas Steffen
  subjkey:   9c:83:b7:e9:0a:7d:dd:08:1f:2d:c5:c6:cc:63:c0:3f:96:57:a2:ce
171 8 Andreas Steffen
172 8 Andreas Steffen
List of X.509 CA Certificates
173 8 Andreas Steffen
174 8 Andreas Steffen
  subject:  "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
175 8 Andreas Steffen
  issuer:   "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
176 8 Andreas Steffen
  validity:  not before Jul 07 08:19:08 2017, ok
177 8 Andreas Steffen
             not after  Jul 07 08:19:08 2027, ok (expires in 3651 days)
178 8 Andreas Steffen
  serial:    3a:98:52:2e:75:a5:a5:8b
179 8 Andreas Steffen
  flags:     CA CRLSign self-signed
180 8 Andreas Steffen
  subjkeyId: 81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
181 8 Andreas Steffen
  pubkey:    ECDSA 256 bits
182 8 Andreas Steffen
  keyid:     85:94:42:42:d7:40:83:17:98:72:7f:d7:6b:4a:08:51:e8:5b:e0:63
183 8 Andreas Steffen
  subjkey:   81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
184 9 Andreas Steffen
</pre>
185 9 Andreas Steffen
186 9 Andreas Steffen
h2. Install Apache Web Server
187 9 Andreas Steffen
188 9 Andreas Steffen
An Apache web server equipped with a *Web Server Gateway Interface (WSGI)* module is installed on Ubuntu by the single command
189 9 Andreas Steffen
<pre>
190 10 Andreas Steffen
sudo apt install apache2 libapache2-mod-wsgi
191 9 Andreas Steffen
</pre>
192 9 Andreas Steffen
193 9 Andreas Steffen
h3. Configure strongTNC Virtual Web Server
194 9 Andreas Steffen
195 9 Andreas Steffen
In the */etc/apache2/sites-available* directory create the following configuration file and name it e.g. *tnc*:
196 9 Andreas Steffen
<pre>
197 9 Andreas Steffen
WSGIPythonPath /var/www/tnc
198 9 Andreas Steffen
199 9 Andreas Steffen
<VirtualHost *:80>
200 9 Andreas Steffen
    ServerName tnc.example.com
201 9 Andreas Steffen
    ServerAdmin webmaster@localhost
202 9 Andreas Steffen
203 9 Andreas Steffen
    DocumentRoot /var/www/tnc
204 9 Andreas Steffen
205 9 Andreas Steffen
    <Directory /var/www/tnc/config>
206 9 Andreas Steffen
        <Files wsgi.py>
207 9 Andreas Steffen
            Order deny,allow
208 9 Andreas Steffen
            Allow from all
209 9 Andreas Steffen
        </Files>
210 9 Andreas Steffen
    </Directory>
211 9 Andreas Steffen
212 9 Andreas Steffen
    WSGIScriptAlias / /var/www/tnc/config/wsgi.py
213 9 Andreas Steffen
    WSGIPassAuthorization On
214 9 Andreas Steffen
215 9 Andreas Steffen
    ErrorLog ${APACHE_LOG_DIR}/tnc/error.log
216 9 Andreas Steffen
    LogLevel warn
217 9 Andreas Steffen
    CustomLog ${APACHE_LOG_DIR}/tnc/access.log combined
218 1 Andreas Steffen
</VirtualHost>
219 11 Andreas Steffen
</pre>
220 11 Andreas Steffen
221 11 Andreas Steffen
The log tnc log directory is created with
222 11 Andreas Steffen
<pre>
223 11 Andreas Steffen
sudo mkdir /var/log/apache2/tnc
224 9 Andreas Steffen
</pre>
225 9 Andreas Steffen
226 9 Andreas Steffen
h2. Initialize PTS Database
227 9 Andreas Steffen
228 9 Andreas Steffen
I you haven't done so yet during the strongSwan TNC server installation, initialize the PTS SQLite database and give group "www-data" write permission:
229 9 Andreas Steffen
<pre>
230 9 Andreas Steffen
sudo mkdir /etc/pts
231 9 Andreas Steffen
cd /usr/share/strongswan/templates/database/imv/
232 9 Andreas Steffen
sudo cat tables.sql data.sql | sqlite3 /etc/pts/config.db
233 9 Andreas Steffen
sudo chgrp www-data /etc/pts /etc/pts/config.db
234 9 Andreas Steffen
sudo chmod g+w /etc/pts /etc/pts/config.db
235 9 Andreas Steffen
</pre>
236 9 Andreas Steffen
237 9 Andreas Steffen
h2. Installing the strongTNC Policy Manager
238 9 Andreas Steffen
239 9 Andreas Steffen
strongTNC is a web application based on the "Django":https://www.djangoproject.com/ framework which itself makes use of the Python scripting language. At least Django 1.8 and Python 2.6.5 are required.  For the following installation and configuration steps we assume an Ubuntu Linux platform but the procedure on other Linux distributions is quite similar.
240 9 Andreas Steffen
241 9 Andreas Steffen
h3. Install strongTNC
242 9 Andreas Steffen
243 9 Andreas Steffen
The "strongTNC project":https://github.com/strongswan/strongTNC/ is hosted on GitHub. The latest release can be installed as follows
244 9 Andreas Steffen
<pre>
245 9 Andreas Steffen
wget https://github.com/strongswan/strongTNC/archive/master.zip
246 9 Andreas Steffen
unzip master.zip
247 9 Andreas Steffen
sudo mv strongTNC-master /var/www/tnc
248 9 Andreas Steffen
sudo chown -R www-data:www-data /var/www/tnc
249 9 Andreas Steffen
</pre>
250 9 Andreas Steffen
251 9 Andreas Steffen
h3. Install Python/Django
252 9 Andreas Steffen
253 9 Andreas Steffen
If not present yet, install the following Ubuntu packages
254 9 Andreas Steffen
255 9 Andreas Steffen
<pre>
256 10 Andreas Steffen
sudo apt install python-pip python-dev libxml2-dev libxslt1-dev
257 9 Andreas Steffen
</pre>
258 9 Andreas Steffen
259 9 Andreas Steffen
In the */var/www/tnc* directory execute the command
260 9 Andreas Steffen
261 9 Andreas Steffen
<pre>
262 9 Andreas Steffen
sudo pip install -r requirements.txt
263 9 Andreas Steffen
</pre>
264 9 Andreas Steffen
265 9 Andreas Steffen
which updates the Django version if necessary and installs various Python modules.
266 9 Andreas Steffen
267 9 Andreas Steffen
h3. Configure strongTNC
268 9 Andreas Steffen
269 9 Andreas Steffen
Copy *config/settings.sample.ini* to */etc/strongTNC/settings.ini* and adapt the settings to your preferences.
270 9 Andreas Steffen
<pre>
271 9 Andreas Steffen
[debug]
272 9 Andreas Steffen
DEBUG=0
273 9 Andreas Steffen
TEMPLATE_DEBUG=0
274 9 Andreas Steffen
DEBUG_TOOLBAR=0
275 9 Andreas Steffen
276 9 Andreas Steffen
[db]
277 9 Andreas Steffen
DJANGO_DB_URL=sqlite:////var/www/tnc/django.db
278 9 Andreas Steffen
STRONGTNC_DB_URL = sqlite:////etc/pts/config.db
279 9 Andreas Steffen
280 9 Andreas Steffen
[localization]
281 9 Andreas Steffen
LANGUAGE_CODE=en-us
282 9 Andreas Steffen
TIME_ZONE=Europe/Zurich
283 9 Andreas Steffen
284 9 Andreas Steffen
[admins]
285 9 Andreas Steffen
Your Name: jane.doe@strongswan.org
286 9 Andreas Steffen
Another Admin: joe.doe@strongswan.org
287 9 Andreas Steffen
288 9 Andreas Steffen
[security]
289 9 Andreas Steffen
SECRET_KEY=<secret key>
290 9 Andreas Steffen
</pre>
291 9 Andreas Steffen
292 9 Andreas Steffen
Newer strongTNC versions do not come with a default django.db database where the login passwords are stored. If the database is missing create */var/www/tnc/django.db* with the following command
293 9 Andreas Steffen
<pre>
294 9 Andreas Steffen
sudo python /var/www/tnc/manage.py migrate --database meta
295 9 Andreas Steffen
</pre>
296 9 Andreas Steffen
297 9 Andreas Steffen
Next set the strongTNC access passwords to "ietf99hackathon" in our example:
298 9 Andreas Steffen
<pre>
299 9 Andreas Steffen
sudo python /var/www/tnc/manage.py setpassword
300 9 Andreas Steffen
--> Please enter a new password for admin-user: <admin-user password>
301 9 Andreas Steffen
--> Granting write_access permission.
302 9 Andreas Steffen
Looking for readonly-user in database...
303 9 Andreas Steffen
--> Please enter a new password for readonly-user: <readonly-user password>
304 9 Andreas Steffen
Passwords updated successfully!
305 9 Andreas Steffen
</pre>
306 9 Andreas Steffen
307 9 Andreas Steffen
In order to get a correct display of the strongTNC web pages you have to execute the following command
308 9 Andreas Steffen
<pre>
309 9 Andreas Steffen
sudo python /var/www/tnc/manage.py collectstatic
310 9 Andreas Steffen
</pre>
311 9 Andreas Steffen
312 9 Andreas Steffen
h3. Start strongTNC Virtual Web Server
313 9 Andreas Steffen
314 9 Andreas Steffen
Now enable the virtual web server in the */etc/apache2/sites-enabled* directory and start it:
315 9 Andreas Steffen
<pre>
316 9 Andreas Steffen
cd /etc/apache2/sites-enabled
317 9 Andreas Steffen
sudo ln -s ../sites-available/tnc tnc
318 9 Andreas Steffen
sudo service apache2 restart
319 8 Andreas Steffen
</pre>