Project

General

Profile

PT-TLS SWIMA Server » History » Version 30

Andreas Steffen, 05.08.2017 13:11

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 30 Andreas Steffen
wget https://download.strongswan.org/strongswan-5.6.0dr4.tar.bz2
15 1 Andreas Steffen
</pre>
16 1 Andreas Steffen
17 1 Andreas Steffen
Unpack the tarball
18 1 Andreas Steffen
<pre>
19 30 Andreas Steffen
tar xf strongswan-5.6.0dr4.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 30 Andreas Steffen
cd strongswan-5.6.0dr4
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 23 Andreas Steffen
      server = tnc.example.com
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 24 Andreas Steffen
The */etc/tnc_config* file defines which Integrity Measurement Validators (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 29 Andreas Steffen
The strongSwan [[IpsecPki|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 19 Andreas Steffen
156 29 Andreas Steffen
The strongSwan [[SwCollector|sw-collector]] and [[PtTlsClient|pt-tls-client]] tools use the libcurl library for TLS connections. Because curl looks for X.509 certificate trust anchors in the /etc/ssl/certs directory, the private "IETF 99 Hackathon CA" must be added to the store of trusted CAs on each endpoint (i.e. TNC client) with the following commands
157 19 Andreas Steffen
<pre>
158 19 Andreas Steffen
cp caCert.pem /usr/local/share/ca-certificates/IETF99_Hackathon_CA.crt
159 19 Andreas Steffen
update-ca-certificates
160 19 Andreas Steffen
</pre>
161 19 Andreas Steffen
162 8 Andreas Steffen
Right after installation the strongSwan TNC daemon has to be enabled and started as a systemd service with the following commands
163 8 Andreas Steffen
<pre>
164 8 Andreas Steffen
sudo systemctl enable strongswan-swanctl
165 8 Andreas Steffen
sudo systemctl start strongswan-swanctl
166 8 Andreas Steffen
</pre>
167 8 Andreas Steffen
168 29 Andreas Steffen
In all subsequent reboots the *strongswan-swanctl* service will be started automatically. The following [[Swanctl|swanctl]] command shows that the service is running and that the certificates and keys have been loaded
169 8 Andreas Steffen
<pre>
170 8 Andreas Steffen
 swanctl --list-certs
171 8 Andreas Steffen
172 8 Andreas Steffen
List of X.509 End Entity Certificates
173 8 Andreas Steffen
174 8 Andreas Steffen
  subject:  "C=CZ, O=IETF, OU=SACM, CN=TNC Server"
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 09:07:31 2017, ok
177 8 Andreas Steffen
             not after  Jul 07 09:07:31 2021, ok (expires in 1460 days)
178 8 Andreas Steffen
  serial:    40:53:6a:88:f5:52:50:3b
179 8 Andreas Steffen
  altNames:  tnc.example.com
180 8 Andreas Steffen
  flags:     serverAuth
181 8 Andreas Steffen
  authkeyId: 81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
182 8 Andreas Steffen
  subjkeyId: 9c:83:b7:e9:0a:7d:dd:08:1f:2d:c5:c6:cc:63:c0:3f:96:57:a2:ce
183 8 Andreas Steffen
  pubkey:    ECDSA 256 bits, has private key
184 8 Andreas Steffen
  keyid:     15:91:40:5f:55:58:1f:9c:18:c1:89:6d:47:7c:bd:50:3d:b4:90:a1
185 8 Andreas Steffen
  subjkey:   9c:83:b7:e9:0a:7d:dd:08:1f:2d:c5:c6:cc:63:c0:3f:96:57:a2:ce
186 8 Andreas Steffen
187 8 Andreas Steffen
List of X.509 CA Certificates
188 8 Andreas Steffen
189 8 Andreas Steffen
  subject:  "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
190 8 Andreas Steffen
  issuer:   "C=CZ, O=IETF, OU=SACM, CN=IETF 99 Prague Hackathon CA"
191 8 Andreas Steffen
  validity:  not before Jul 07 08:19:08 2017, ok
192 8 Andreas Steffen
             not after  Jul 07 08:19:08 2027, ok (expires in 3651 days)
193 8 Andreas Steffen
  serial:    3a:98:52:2e:75:a5:a5:8b
194 8 Andreas Steffen
  flags:     CA CRLSign self-signed
195 8 Andreas Steffen
  subjkeyId: 81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
196 8 Andreas Steffen
  pubkey:    ECDSA 256 bits
197 8 Andreas Steffen
  keyid:     85:94:42:42:d7:40:83:17:98:72:7f:d7:6b:4a:08:51:e8:5b:e0:63
198 8 Andreas Steffen
  subjkey:   81:44:64:84:26:5f:f6:08:80:4a:c9:77:32:0e:b2:78:d0:8f:e5:84
199 9 Andreas Steffen
</pre>
200 9 Andreas Steffen
201 9 Andreas Steffen
h2. Install Apache Web Server
202 9 Andreas Steffen
203 9 Andreas Steffen
An Apache web server equipped with a *Web Server Gateway Interface (WSGI)* module is installed on Ubuntu by the single command
204 9 Andreas Steffen
<pre>
205 10 Andreas Steffen
sudo apt install apache2 libapache2-mod-wsgi
206 9 Andreas Steffen
</pre>
207 9 Andreas Steffen
208 12 Andreas Steffen
In order to secure the access to the web server we enable TLS
209 12 Andreas Steffen
<pre>
210 12 Andreas Steffen
a2enmod ssl
211 12 Andreas Steffen
</pre>
212 12 Andreas Steffen
213 9 Andreas Steffen
h3. Configure strongTNC Virtual Web Server
214 9 Andreas Steffen
215 16 Andreas Steffen
In the */etc/apache2/sites-available* directory create the following configuration file and name it e.g. *tnc.conf*:
216 9 Andreas Steffen
<pre>
217 9 Andreas Steffen
WSGIPythonPath /var/www/tnc
218 1 Andreas Steffen
219 12 Andreas Steffen
<VirtualHost *:443>
220 9 Andreas Steffen
    ServerName tnc.example.com
221 9 Andreas Steffen
    ServerAdmin webmaster@localhost
222 9 Andreas Steffen
223 9 Andreas Steffen
    DocumentRoot /var/www/tnc
224 9 Andreas Steffen
225 9 Andreas Steffen
    <Directory /var/www/tnc/config>
226 9 Andreas Steffen
        <Files wsgi.py>
227 9 Andreas Steffen
            Order deny,allow
228 9 Andreas Steffen
            Allow from all
229 9 Andreas Steffen
        </Files>
230 9 Andreas Steffen
    </Directory>
231 9 Andreas Steffen
232 9 Andreas Steffen
    WSGIScriptAlias / /var/www/tnc/config/wsgi.py
233 9 Andreas Steffen
    WSGIPassAuthorization On
234 1 Andreas Steffen
235 12 Andreas Steffen
    SSLEngine on
236 12 Andreas Steffen
    SSLCertificateFile    /etc/swanctl/x509/serverCert.pem
237 12 Andreas Steffen
    SSLCertificateKeyFile /etc/swanctl/ecdsa/serverKey.pem
238 12 Andreas Steffen
239 9 Andreas Steffen
    ErrorLog ${APACHE_LOG_DIR}/tnc/error.log
240 9 Andreas Steffen
    LogLevel warn
241 1 Andreas Steffen
    CustomLog ${APACHE_LOG_DIR}/tnc/access.log combined
242 11 Andreas Steffen
</VirtualHost>
243 1 Andreas Steffen
</pre>
244 11 Andreas Steffen
245 12 Andreas Steffen
The *tnc* log directory is created with
246 11 Andreas Steffen
<pre>
247 11 Andreas Steffen
sudo mkdir /var/log/apache2/tnc
248 9 Andreas Steffen
</pre>
249 9 Andreas Steffen
250 9 Andreas Steffen
h2. Initialize PTS Database
251 9 Andreas Steffen
252 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:
253 9 Andreas Steffen
<pre>
254 9 Andreas Steffen
cd /usr/share/strongswan/templates/database/imv/
255 9 Andreas Steffen
sudo cat tables.sql data.sql | sqlite3 /etc/pts/config.db
256 9 Andreas Steffen
sudo chgrp www-data /etc/pts /etc/pts/config.db
257 9 Andreas Steffen
sudo chmod g+w /etc/pts /etc/pts/config.db
258 9 Andreas Steffen
</pre>
259 9 Andreas Steffen
260 9 Andreas Steffen
h2. Installing the strongTNC Policy Manager
261 9 Andreas Steffen
262 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.
263 9 Andreas Steffen
264 21 Andreas Steffen
h3. Installing strongTNC
265 9 Andreas Steffen
266 9 Andreas Steffen
The "strongTNC project":https://github.com/strongswan/strongTNC/ is hosted on GitHub. The latest release can be installed as follows
267 9 Andreas Steffen
<pre>
268 9 Andreas Steffen
wget https://github.com/strongswan/strongTNC/archive/master.zip
269 9 Andreas Steffen
unzip master.zip
270 9 Andreas Steffen
sudo mv strongTNC-master /var/www/tnc
271 9 Andreas Steffen
sudo chown -R www-data:www-data /var/www/tnc
272 9 Andreas Steffen
</pre>
273 9 Andreas Steffen
274 21 Andreas Steffen
h3. Installing Python/Django
275 9 Andreas Steffen
276 9 Andreas Steffen
If not present yet, install the following Ubuntu packages
277 9 Andreas Steffen
278 9 Andreas Steffen
<pre>
279 18 Andreas Steffen
sudo apt install python-pip python-dev libxml2-dev libxslt1-dev requests
280 9 Andreas Steffen
</pre>
281 9 Andreas Steffen
282 9 Andreas Steffen
In the */var/www/tnc* directory execute the command
283 9 Andreas Steffen
284 9 Andreas Steffen
<pre>
285 9 Andreas Steffen
sudo pip install -r requirements.txt
286 9 Andreas Steffen
</pre>
287 9 Andreas Steffen
288 9 Andreas Steffen
which updates the Django version if necessary and installs various Python modules.
289 9 Andreas Steffen
290 22 Andreas Steffen
h3. Configuring strongTNC
291 9 Andreas Steffen
292 9 Andreas Steffen
Copy *config/settings.sample.ini* to */etc/strongTNC/settings.ini* and adapt the settings to your preferences.
293 9 Andreas Steffen
<pre>
294 9 Andreas Steffen
[debug]
295 15 Andreas Steffen
DEBUG = 1
296 15 Andreas Steffen
TEMPLATE_DEBUG = 0
297 15 Andreas Steffen
SQL_DEBUG = 0
298 15 Andreas Steffen
DEBUG_TOOLBAR = 0
299 9 Andreas Steffen
300 9 Andreas Steffen
[db]
301 15 Andreas Steffen
DJANGO_DB_URL = sqlite:////var/www/tnc/django.db
302 9 Andreas Steffen
STRONGTNC_DB_URL = sqlite:////etc/pts/config.db
303 9 Andreas Steffen
304 15 Andreas Steffen
[paths]
305 15 Andreas Steffen
STATIC_ROOT = static
306 9 Andreas Steffen
307 9 Andreas Steffen
[security]
308 15 Andreas Steffen
ALLOWED_HOSTS = 127.0.0.1,tnc.example.com
309 15 Andreas Steffen
CSRF_COOKIE_SECURE = 1
310 17 Andreas Steffen
311 17 Andreas Steffen
[localization]
312 17 Andreas Steffen
LANGUAGE_CODE = en-us
313 17 Andreas Steffen
TIME_ZONE = Etc/UTC
314 17 Andreas Steffen
315 17 Andreas Steffen
[admins]
316 17 Andreas Steffen
Your Name: andreas.steffen@strongswan.org
317 1 Andreas Steffen
</pre>
318 22 Andreas Steffen
319 22 Andreas Steffen
h3. Configuring strongTNC Access Passwords
320 9 Andreas Steffen
321 20 Andreas Steffen
Create the django.db database where the login passwords are stored with the command
322 9 Andreas Steffen
<pre>
323 9 Andreas Steffen
sudo python /var/www/tnc/manage.py migrate --database meta
324 9 Andreas Steffen
</pre>
325 9 Andreas Steffen
326 15 Andreas Steffen
Next set the strongTNC access passwords ("ietf99hackathon" in our example):
327 9 Andreas Steffen
<pre>
328 9 Andreas Steffen
sudo python /var/www/tnc/manage.py setpassword
329 15 Andreas Steffen
--> Please enter a new password for admin-user: ietf99hackathon
330 9 Andreas Steffen
--> Granting write_access permission.
331 9 Andreas Steffen
Looking for readonly-user in database...
332 15 Andreas Steffen
--> Please enter a new password for readonly-user: ietf99hackathon
333 9 Andreas Steffen
Passwords updated successfully!
334 1 Andreas Steffen
</pre>
335 1 Andreas Steffen
336 21 Andreas Steffen
as well as the *admin* password
337 21 Andreas Steffen
<pre>
338 21 Andreas Steffen
sudo python /var/www/tnc/manage.py createsuperuser --database meta
339 21 Andreas Steffen
--> Username (leave blank to use 'root'): admin
340 21 Andreas Steffen
--> Email address: andreas.steffen@strongswan.org
341 21 Andreas Steffen
--> Password: ietf99hackathon
342 21 Andreas Steffen
--> Password (again): ietf99hackathon
343 21 Andreas Steffen
Superuser created successfully.
344 21 Andreas Steffen
</pre>
345 21 Andreas Steffen
346 9 Andreas Steffen
In order to get a correct display of the strongTNC web pages you have to execute the following command
347 9 Andreas Steffen
<pre>
348 1 Andreas Steffen
sudo python /var/www/tnc/manage.py collectstatic
349 9 Andreas Steffen
</pre>
350 9 Andreas Steffen
351 21 Andreas Steffen
h3. Starting the strongTNC Virtual Web Server
352 9 Andreas Steffen
353 9 Andreas Steffen
Now enable the virtual web server in the */etc/apache2/sites-enabled* directory and start it:
354 9 Andreas Steffen
<pre>
355 9 Andreas Steffen
cd /etc/apache2/sites-enabled
356 1 Andreas Steffen
sudo ln -s ../sites-available/tnc.conf tnc.conf
357 1 Andreas Steffen
sudo systemctl restart apache2
358 1 Andreas Steffen
</pre>
359 21 Andreas Steffen
360 21 Andreas Steffen
h3. Accessing the strongTNC Server
361 21 Andreas Steffen
362 21 Andreas Steffen
* The strongTNC GUI can be accessed as either "ReadOnly" *user* or "Read/Write" *admin-user* with "https://tnc.example.com/":https://tnc.example.com/
363 21 Andreas Steffen
364 21 Andreas Steffen
* The strongTNC REST API can accessed as *admin-user* with "https://tnc.example.com/api/":https://tnc.example.com/api/
365 21 Andreas Steffen
366 21 Andreas Steffen
* The Django database interface can be accessed as *admin* with "https://tnc.example.com/admin/":https://tnc.example.com/admin/
367 21 Andreas Steffen
368 21 Andreas Steffen
Since "tnc.example.com" cannot be resolved by DNS, add an entry to "/etc/hosts".
369 25 Andreas Steffen
370 25 Andreas Steffen
h2. Bulk SWID Tag Import
371 25 Andreas Steffen
372 25 Andreas Steffen
h3. The "get_dpkg_packages" Python Script
373 25 Andreas Steffen
374 25 Andreas Steffen
In order to fill the strongTNC database with a collection of SWID tag for each supported OS, these tags can be collected on a reference system with the following python script
375 25 Andreas Steffen
<pre>
376 25 Andreas Steffen
#!/usr/bin/env python
377 25 Andreas Steffen
378 25 Andreas Steffen
import json
379 25 Andreas Steffen
import requests
380 25 Andreas Steffen
import platform
381 25 Andreas Steffen
import os
382 25 Andreas Steffen
import sys
383 25 Andreas Steffen
384 25 Andreas Steffen
# strongTNC server
385 25 Andreas Steffen
user = "admin-user"
386 25 Andreas Steffen
password = "ietf99hackathon"
387 25 Andreas Steffen
host = "https://tnc.example.com"
388 25 Andreas Steffen
389 25 Andreas Steffen
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
390 25 Andreas Steffen
    '/etc/ssl/certs/',
391 25 Andreas Steffen
    'ca-certificates.crt')
392 25 Andreas Steffen
393 25 Andreas Steffen
product = '-'.join(['_'.join(platform.dist()[:2]).capitalize(), platform.machine()])
394 25 Andreas Steffen
session = requests.Session()
395 25 Andreas Steffen
packages = 0
396 25 Andreas Steffen
new = 0
397 25 Andreas Steffen
398 25 Andreas Steffen
p = os.popen('dpkg-query -W -f=\'${Package}\t${Version}\t${Status}\n\'', 'r')
399 25 Andreas Steffen
while True:
400 25 Andreas Steffen
    line = p.readline()
401 25 Andreas Steffen
    if not line:
402 25 Andreas Steffen
        break
403 25 Andreas Steffen
    packages += 1
404 25 Andreas Steffen
    words = line.split()
405 25 Andreas Steffen
    package = words[0]
406 25 Andreas Steffen
    version = words[1]
407 25 Andreas Steffen
    state = words[2]
408 25 Andreas Steffen
    if state == 'deinstall':
409 25 Andreas Steffen
        continue
410 25 Andreas Steffen
    # unique_id must be sanitized for http queries
411 25 Andreas Steffen
    package_url = package.replace(':', '~').replace('+', '~')
412 25 Andreas Steffen
    version_url = version.replace(':', '~').replace('+', '~')
413 25 Andreas Steffen
    unique_id = product + "-" + package_url + "-" + version_url
414 25 Andreas Steffen
    resp = session.get(host + "/api/swid-tags/?fields=unique_id&" +
415 25 Andreas Steffen
                       "unique_id=" + unique_id, auth=(user, password))
416 25 Andreas Steffen
    if resp.status_code != 200:
417 25 Andreas Steffen
        sys.stderr.write("http request to %s failed: %d" % (host, resp.status_code))
418 25 Andreas Steffen
        continue
419 25 Andreas Steffen
    objects = resp.json()
420 25 Andreas Steffen
    exists = False
421 25 Andreas Steffen
    for obj in objects:
422 25 Andreas Steffen
        exists = True
423 25 Andreas Steffen
        break
424 25 Andreas Steffen
    if not exists:
425 25 Andreas Steffen
        sys.stderr.write("Created %s\n" % unique_id)
426 25 Andreas Steffen
        o = os.popen('swid_generator swid --full --package ' + package)
427 25 Andreas Steffen
        while True:
428 25 Andreas Steffen
            line = o.readline()
429 25 Andreas Steffen
            if not line:
430 25 Andreas Steffen
                break
431 25 Andreas Steffen
            sys.stdout.write(line)
432 25 Andreas Steffen
        new += 1
433 25 Andreas Steffen
sys.stderr.write("%d packages, %d new\n" % (packages, new))
434 25 Andreas Steffen
</pre>
435 25 Andreas Steffen
436 25 Andreas Steffen
h3. Installing the strongSwan "swid_generator" Tool
437 25 Andreas Steffen
438 26 Andreas Steffen
h3. Generating SWID Tags in a Bulk
439 25 Andreas Steffen
440 25 Andreas Steffen
<pre>
441 25 Andreas Steffen
sudo ./get_dpkg_packages.py > Tags/Ubuntu_16.04-x86_64-20170708.tags
442 25 Andreas Steffen
443 25 Andreas Steffen
Created Ubuntu_16.04-x86_64-activity-log-manager-0.9.7-0ubuntu23.16.04.1
444 25 Andreas Steffen
Created Ubuntu_16.04-x86_64-apparmor-2.10.95-0ubuntu2.6
445 25 Andreas Steffen
Created Ubuntu_16.04-x86_64-appmenu-qt5-0.3.0~16.04.20170216-0ubuntu1
446 25 Andreas Steffen
...
447 25 Andreas Steffen
Created Ubuntu_16.04-x86_64-vino-3.8.1-0ubuntu9.2
448 25 Andreas Steffen
Created Ubuntu_16.04-x86_64-wget-1.17.1-1ubuntu1.2
449 25 Andreas Steffen
Created Ubuntu_16.04-x86_64-whoopsie-0.2.52.3
450 25 Andreas Steffen
1798 packages, 236 new
451 25 Andreas Steffen
</pre>
452 25 Andreas Steffen
453 25 Andreas Steffen
h3. Importing SWID Tags in a Bulk
454 25 Andreas Steffen
455 25 Andreas Steffen
<pre>
456 25 Andreas Steffen
sudo python /var/www/tnc/manage.py importswid Tags/Ubuntu_16.04-x86_64-20170708.tags
457 25 Andreas Steffen
458 25 Andreas Steffen
Added Ubuntu_16.04-x86_64-activity-log-manager-0.9.7-0ubuntu23.16.04.1
459 25 Andreas Steffen
Added Ubuntu_16.04-x86_64-apparmor-2.10.95-0ubuntu2.6
460 25 Andreas Steffen
Added Ubuntu_16.04-x86_64-appmenu-qt5-0.3.0~16.04.20170216-0ubuntu1
461 1 Andreas Steffen
...
462 26 Andreas Steffen
Added Ubuntu_16.04-x86_64-vino-3.8.1-0ubuntu9.2
463 26 Andreas Steffen
Added Ubuntu_16.04-x86_64-wget-1.17.1-1ubuntu1.2
464 26 Andreas Steffen
Added Ubuntu_16.04-x86_64-whoopsie-0.2.52.3
465 25 Andreas Steffen
</pre>