Project

General

Profile

PT-TLS SWIMA Server » History » Version 15

Andreas Steffen, 07.07.2017 21:33

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 14 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 1 Andreas Steffen
}
84 14 Andreas Steffen
</pre>
85 14 Andreas Steffen
86 14 Andreas Steffen
87 14 Andreas Steffen
The */etc/tnc_config* file defines which Integrity Measurement Collectors (IMVs) are loaded by the TNC server
88 14 Andreas Steffen
<pre>
89 14 Andreas Steffen
#IMV-Configuration
90 14 Andreas Steffen
IMV "OS"        /usr/lib/ipsec/imcvs/imv-os.so
91 14 Andreas Steffen
IMV "SWIMA"     /usr/lib/ipsec/imcvs/imv-swima.so
92 7 Andreas Steffen
</pre>
93 7 Andreas Steffen
94 11 Andreas Steffen
h2. Setting up a CA using the strongSwan "pki" Tool
95 3 Andreas Steffen
96 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
97 3 Andreas Steffen
<pre>
98 3 Andreas Steffen
  sudo -s
99 3 Andreas Steffen
  mkdir /etc/pts
100 3 Andreas Steffen
  mkdir /etc/pts/pki
101 3 Andreas Steffen
  cd /etc/pts/pki
102 3 Andreas Steffen
</pre>
103 3 Andreas Steffen
104 3 Andreas Steffen
Then we generate an ECC public key pair for the Root CA and a matching self-signed CA certificate
105 3 Andreas Steffen
<pre>
106 3 Andreas Steffen
pki --gen --type ecdsa --size 256 --outform pem > caKey.pem
107 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
108 3 Andreas Steffen
</pre>
109 3 Andreas Steffen
110 3 Andreas Steffen
The CA certificate can be listed with the following command
111 3 Andreas Steffen
<pre>
112 3 Andreas Steffen
pki --print --in caCert.pem
113 3 Andreas Steffen
  subject:  "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
114 3 Andreas Steffen
  issuer:   "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
115 3 Andreas Steffen
  validity:  not before Jul 07 08:19:08 2017, ok
116 3 Andreas Steffen
             not after  Jul 07 08:19:08 2027, ok (expires in 3651 days)
117 3 Andreas Steffen
  serial:    3a:98:52:2e:75:a5:a5:8b
118 3 Andreas Steffen
  flags:     CA CRLSign self-signed
119 3 Andreas Steffen
  subjkeyId: 81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
120 3 Andreas Steffen
  pubkey:    ECDSA 256 bits
121 3 Andreas Steffen
  keyid:     85:94:42:42:d7:40:83:17:98:72:7f:d7:6b:4a:08:51:e8:5b:e0:63
122 3 Andreas Steffen
  subjkey:   81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
123 3 Andreas Steffen
</pre>
124 4 Andreas Steffen
125 4 Andreas Steffen
<pre>
126 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
127 4 Andreas Steffen
</pre>
128 4 Andreas Steffen
129 4 Andreas Steffen
<pre>
130 4 Andreas Steffen
pki --issue --cakey caKey.pem --cacert caCert.pem --in serverReq.pem --type pkcs10 --flag serverAuth --lifetime 1461 --outform pem > serverCert.pem
131 4 Andreas Steffen
</pre>
132 4 Andreas Steffen
133 4 Andreas Steffen
<pre>
134 4 Andreas Steffen
pki --print --in serverCert.pem
135 4 Andreas Steffen
  subject:  "C=CZ, O=IETF, OU=SACM, CN=TNC Server"
136 4 Andreas Steffen
  issuer:   "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
137 4 Andreas Steffen
  validity:  not before Jul 07 09:07:31 2017, ok
138 4 Andreas Steffen
             not after  Jul 07 09:07:31 2021, ok (expires in 1460 days)
139 4 Andreas Steffen
  serial:    40:53:6a:88:f5:52:50:3b
140 4 Andreas Steffen
  altNames:  tnc.example.com
141 4 Andreas Steffen
  flags:     serverAuth
142 4 Andreas Steffen
  authkeyId: 81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
143 4 Andreas Steffen
  subjkeyId: 9c:83:b7:e9:0a:7d:dd:08:1f:2d:c5:c6:cc:63:c0:3f:96:57:a2:ce
144 4 Andreas Steffen
  pubkey:    ECDSA 256 bits
145 4 Andreas Steffen
  keyid:     15:91:40:5f:55:58:1f:9c:18:c1:89:6d:47:7c:bd:50:3d:b4:90:a1
146 4 Andreas Steffen
  subjkey:   9c:83:b7:e9:0a:7d:dd:08:1f:2d:c5:c6:cc:63:c0:3f:96:57:a2:ce
147 1 Andreas Steffen
</pre>
148 4 Andreas Steffen
149 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.
150 5 Andreas Steffen
<pre>
151 5 Andreas Steffen
cp caCert.pem /etc/swanctl/x509ca
152 5 Andreas Steffen
cp serverCert.pem /etc/swanctl/x509
153 5 Andreas Steffen
cp serverKey.pem /etc/swanctl/ecdsa
154 5 Andreas Steffen
</pre>
155 8 Andreas Steffen
Right after installation the strongSwan TNC daemon has to be enabled and started as a systemd service with the following commands
156 8 Andreas Steffen
<pre>
157 8 Andreas Steffen
sudo systemctl enable strongswan-swanctl
158 8 Andreas Steffen
sudo systemctl start strongswan-swanctl
159 8 Andreas Steffen
</pre>
160 8 Andreas Steffen
161 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
162 8 Andreas Steffen
<pre>
163 8 Andreas Steffen
 swanctl --list-certs
164 8 Andreas Steffen
165 8 Andreas Steffen
List of X.509 End Entity Certificates
166 8 Andreas Steffen
167 8 Andreas Steffen
  subject:  "C=CZ, O=IETF, OU=SACM, CN=TNC Server"
168 8 Andreas Steffen
  issuer:   "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
169 8 Andreas Steffen
  validity:  not before Jul 07 09:07:31 2017, ok
170 8 Andreas Steffen
             not after  Jul 07 09:07:31 2021, ok (expires in 1460 days)
171 8 Andreas Steffen
  serial:    40:53:6a:88:f5:52:50:3b
172 8 Andreas Steffen
  altNames:  tnc.example.com
173 8 Andreas Steffen
  flags:     serverAuth
174 8 Andreas Steffen
  authkeyId: 81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
175 8 Andreas Steffen
  subjkeyId: 9c:83:b7:e9:0a:7d:dd:08:1f:2d:c5:c6:cc:63:c0:3f:96:57:a2:ce
176 8 Andreas Steffen
  pubkey:    ECDSA 256 bits, has private key
177 8 Andreas Steffen
  keyid:     15:91:40:5f:55:58:1f:9c:18:c1:89:6d:47:7c:bd:50:3d:b4:90:a1
178 8 Andreas Steffen
  subjkey:   9c:83:b7:e9:0a:7d:dd:08:1f:2d:c5:c6:cc:63:c0:3f:96:57:a2:ce
179 8 Andreas Steffen
180 8 Andreas Steffen
List of X.509 CA Certificates
181 8 Andreas Steffen
182 8 Andreas Steffen
  subject:  "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
183 8 Andreas Steffen
  issuer:   "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
184 8 Andreas Steffen
  validity:  not before Jul 07 08:19:08 2017, ok
185 8 Andreas Steffen
             not after  Jul 07 08:19:08 2027, ok (expires in 3651 days)
186 8 Andreas Steffen
  serial:    3a:98:52:2e:75:a5:a5:8b
187 8 Andreas Steffen
  flags:     CA CRLSign self-signed
188 8 Andreas Steffen
  subjkeyId: 81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
189 8 Andreas Steffen
  pubkey:    ECDSA 256 bits
190 8 Andreas Steffen
  keyid:     85:94:42:42:d7:40:83:17:98:72:7f:d7:6b:4a:08:51:e8:5b:e0:63
191 8 Andreas Steffen
  subjkey:   81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
192 9 Andreas Steffen
</pre>
193 9 Andreas Steffen
194 9 Andreas Steffen
h2. Install Apache Web Server
195 9 Andreas Steffen
196 9 Andreas Steffen
An Apache web server equipped with a *Web Server Gateway Interface (WSGI)* module is installed on Ubuntu by the single command
197 9 Andreas Steffen
<pre>
198 10 Andreas Steffen
sudo apt install apache2 libapache2-mod-wsgi
199 9 Andreas Steffen
</pre>
200 9 Andreas Steffen
201 12 Andreas Steffen
In order to secure the access to the web server we enable TLS
202 12 Andreas Steffen
<pre>
203 12 Andreas Steffen
a2enmod ssl
204 12 Andreas Steffen
</pre>
205 12 Andreas Steffen
206 9 Andreas Steffen
h3. Configure strongTNC Virtual Web Server
207 9 Andreas Steffen
208 9 Andreas Steffen
In the */etc/apache2/sites-available* directory create the following configuration file and name it e.g. *tnc*:
209 9 Andreas Steffen
<pre>
210 9 Andreas Steffen
WSGIPythonPath /var/www/tnc
211 1 Andreas Steffen
212 12 Andreas Steffen
<VirtualHost *:443>
213 9 Andreas Steffen
    ServerName tnc.example.com
214 9 Andreas Steffen
    ServerAdmin webmaster@localhost
215 9 Andreas Steffen
216 9 Andreas Steffen
    DocumentRoot /var/www/tnc
217 9 Andreas Steffen
218 9 Andreas Steffen
    <Directory /var/www/tnc/config>
219 9 Andreas Steffen
        <Files wsgi.py>
220 9 Andreas Steffen
            Order deny,allow
221 9 Andreas Steffen
            Allow from all
222 9 Andreas Steffen
        </Files>
223 9 Andreas Steffen
    </Directory>
224 9 Andreas Steffen
225 9 Andreas Steffen
    WSGIScriptAlias / /var/www/tnc/config/wsgi.py
226 9 Andreas Steffen
    WSGIPassAuthorization On
227 1 Andreas Steffen
228 12 Andreas Steffen
    SSLEngine on
229 12 Andreas Steffen
    SSLCertificateFile    /etc/swanctl/x509/serverCert.pem
230 12 Andreas Steffen
    SSLCertificateKeyFile /etc/swanctl/ecdsa/serverKey.pem
231 12 Andreas Steffen
232 9 Andreas Steffen
    ErrorLog ${APACHE_LOG_DIR}/tnc/error.log
233 9 Andreas Steffen
    LogLevel warn
234 1 Andreas Steffen
    CustomLog ${APACHE_LOG_DIR}/tnc/access.log combined
235 11 Andreas Steffen
</VirtualHost>
236 1 Andreas Steffen
</pre>
237 11 Andreas Steffen
238 12 Andreas Steffen
The *tnc* log directory is created with
239 11 Andreas Steffen
<pre>
240 11 Andreas Steffen
sudo mkdir /var/log/apache2/tnc
241 9 Andreas Steffen
</pre>
242 9 Andreas Steffen
243 9 Andreas Steffen
h2. Initialize PTS Database
244 9 Andreas Steffen
245 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:
246 9 Andreas Steffen
<pre>
247 9 Andreas Steffen
cd /usr/share/strongswan/templates/database/imv/
248 9 Andreas Steffen
sudo cat tables.sql data.sql | sqlite3 /etc/pts/config.db
249 9 Andreas Steffen
sudo chgrp www-data /etc/pts /etc/pts/config.db
250 9 Andreas Steffen
sudo chmod g+w /etc/pts /etc/pts/config.db
251 9 Andreas Steffen
</pre>
252 9 Andreas Steffen
253 9 Andreas Steffen
h2. Installing the strongTNC Policy Manager
254 9 Andreas Steffen
255 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.
256 9 Andreas Steffen
257 9 Andreas Steffen
h3. Install strongTNC
258 9 Andreas Steffen
259 9 Andreas Steffen
The "strongTNC project":https://github.com/strongswan/strongTNC/ is hosted on GitHub. The latest release can be installed as follows
260 9 Andreas Steffen
<pre>
261 9 Andreas Steffen
wget https://github.com/strongswan/strongTNC/archive/master.zip
262 9 Andreas Steffen
unzip master.zip
263 9 Andreas Steffen
sudo mv strongTNC-master /var/www/tnc
264 9 Andreas Steffen
sudo chown -R www-data:www-data /var/www/tnc
265 9 Andreas Steffen
</pre>
266 9 Andreas Steffen
267 9 Andreas Steffen
h3. Install Python/Django
268 9 Andreas Steffen
269 9 Andreas Steffen
If not present yet, install the following Ubuntu packages
270 9 Andreas Steffen
271 9 Andreas Steffen
<pre>
272 10 Andreas Steffen
sudo apt install python-pip python-dev libxml2-dev libxslt1-dev
273 9 Andreas Steffen
</pre>
274 9 Andreas Steffen
275 9 Andreas Steffen
In the */var/www/tnc* directory execute the command
276 9 Andreas Steffen
277 9 Andreas Steffen
<pre>
278 9 Andreas Steffen
sudo pip install -r requirements.txt
279 9 Andreas Steffen
</pre>
280 9 Andreas Steffen
281 9 Andreas Steffen
which updates the Django version if necessary and installs various Python modules.
282 9 Andreas Steffen
283 9 Andreas Steffen
h3. Configure strongTNC
284 9 Andreas Steffen
285 9 Andreas Steffen
Copy *config/settings.sample.ini* to */etc/strongTNC/settings.ini* and adapt the settings to your preferences.
286 9 Andreas Steffen
<pre>
287 9 Andreas Steffen
[debug]
288 15 Andreas Steffen
DEBUG = 1
289 15 Andreas Steffen
TEMPLATE_DEBUG = 0
290 15 Andreas Steffen
SQL_DEBUG = 0
291 15 Andreas Steffen
DEBUG_TOOLBAR = 0
292 9 Andreas Steffen
293 9 Andreas Steffen
[db]
294 15 Andreas Steffen
DJANGO_DB_URL = sqlite:////var/www/tnc/django.db
295 9 Andreas Steffen
STRONGTNC_DB_URL = sqlite:////etc/pts/config.db
296 9 Andreas Steffen
297 15 Andreas Steffen
[paths]
298 15 Andreas Steffen
STATIC_ROOT = static
299 9 Andreas Steffen
300 9 Andreas Steffen
[security]
301 15 Andreas Steffen
ALLOWED_HOSTS = 127.0.0.1,tnc.example.com
302 15 Andreas Steffen
CSRF_COOKIE_SECURE = 1
303 9 Andreas Steffen
</pre>
304 9 Andreas Steffen
305 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
306 9 Andreas Steffen
<pre>
307 9 Andreas Steffen
sudo python /var/www/tnc/manage.py migrate --database meta
308 9 Andreas Steffen
</pre>
309 9 Andreas Steffen
310 15 Andreas Steffen
Next set the strongTNC access passwords ("ietf99hackathon" in our example):
311 9 Andreas Steffen
<pre>
312 9 Andreas Steffen
sudo python /var/www/tnc/manage.py setpassword
313 15 Andreas Steffen
--> Please enter a new password for admin-user: ietf99hackathon
314 9 Andreas Steffen
--> Granting write_access permission.
315 9 Andreas Steffen
Looking for readonly-user in database...
316 15 Andreas Steffen
--> Please enter a new password for readonly-user: ietf99hackathon
317 9 Andreas Steffen
Passwords updated successfully!
318 9 Andreas Steffen
</pre>
319 9 Andreas Steffen
320 9 Andreas Steffen
In order to get a correct display of the strongTNC web pages you have to execute the following command
321 9 Andreas Steffen
<pre>
322 9 Andreas Steffen
sudo python /var/www/tnc/manage.py collectstatic
323 9 Andreas Steffen
</pre>
324 9 Andreas Steffen
325 9 Andreas Steffen
h3. Start strongTNC Virtual Web Server
326 9 Andreas Steffen
327 9 Andreas Steffen
Now enable the virtual web server in the */etc/apache2/sites-enabled* directory and start it:
328 9 Andreas Steffen
<pre>
329 9 Andreas Steffen
cd /etc/apache2/sites-enabled
330 9 Andreas Steffen
sudo ln -s ../sites-available/tnc tnc
331 15 Andreas Steffen
sudo systemctl restart apache2
332 8 Andreas Steffen
</pre>