Skip to content

Commit 4a446af

Browse files
committed
Added tnc docker directory
1 parent 3c969d5 commit 4a446af

20 files changed

+583
-1
lines changed

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
A collection of docker image build files:
33

44
* [strongswan](strongswan): A strongSwan 5.x IKEv2 Daemon with a VICI interface
5-
* [pq-strongswan](pq-strongswan) A strongSwan 6.0dr Post-Quantum IKEv2 Daemon
5+
* [pq-strongswan](pq-strongswan): A strongSwan 6.0dr Post-Quantum IKEv2 Daemon
66
* [tpm](tpm): Use the IBM TPM 2.0 simulator with the `tpm2-tools`
7+
* [tnc](tnc): A strongSwan TNC client and a TNC server
78

89
Author: [Andreas Steffen][AS] [CC BY 4.0][CC]
910

tnc/Dockerfile.client

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
FROM ubuntu:20.04
2+
MAINTAINER Andreas Steffen <[email protected]>
3+
ENV VERSION="5.9.5"
4+
ENV TZ="Europe/Zurich"
5+
ENV TMPL="/usr/share/strongswan/templates/database/sw-collector"
6+
7+
RUN \
8+
# set timezone
9+
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
10+
# install packages
11+
DEV_PACKAGES="wget make gcc libssl-dev libsqlite3-dev pkg-config libjson-c-dev" && \
12+
apt-get -y update && \
13+
apt-get -y install iproute2 iputils-ping nano sqlite3 libjson-c4 net-tools $DEV_PACKAGES && \
14+
\
15+
# download and build strongSwan IKEv2 daemon
16+
mkdir /strongswan-build && \
17+
cd /strongswan-build && \
18+
wget https://download.strongswan.org/strongswan-$VERSION.tar.bz2 && \
19+
tar xfj strongswan-$VERSION.tar.bz2 && \
20+
cd strongswan-$VERSION && \
21+
./configure --prefix=/usr --sysconfdir=/etc --disable-defaults \
22+
--enable-charon --enable-ikev2 --enable-nonce --enable-random \
23+
--enable-openssl --enable-pkcs1 --enable-pkcs8 --enable-pkcs12 \
24+
--enable-pem --enable-x509 --enable-pubkey --enable-constraints \
25+
--enable-pki --enable-socket-default --enable-kernel-netlink \
26+
--enable-eap-identity --enable-eap-md5 --enable-eap-ttls \
27+
--enable-eap-tnc --enable-updown --enable-vici --enable-drbg \
28+
--enable-swanctl --enable-resolve --enable-silent-rules \
29+
--enable-tnccs-20 --enable-tnc-imc --enable-sqlite \
30+
--enable-imc-os --enable-imc-swima --enable-imc-scanner && \
31+
make all && make install && \
32+
cd / && rm -R strongswan-build && \
33+
ln -s /usr/libexec/ipsec/charon charon && mkdir /etc/pts && \
34+
cat $TMPL/sw_collector_tables.sql | sqlite3 /etc/pts/collector.db && \
35+
\
36+
# clean up
37+
apt-get -y remove $DEV_PACKAGES && \
38+
apt-get -y autoremove && \
39+
apt-get clean && \
40+
rm -rf /var/lib/apt/lists/*
41+
42+
# Expose IKE and NAT-T ports
43+
EXPOSE 500 4500

tnc/Dockerfile.server

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
FROM ubuntu:20.04
2+
MAINTAINER Andreas Steffen <[email protected]>
3+
ENV VERSION="5.9.5"
4+
ENV TZ="Europe/Zurich"
5+
ENV TMPL="/usr/share/strongswan/templates/database/imv"
6+
7+
RUN \
8+
# set timezone
9+
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
10+
# install packages
11+
DEV_PACKAGES="wget make gcc libssl-dev libsqlite3-dev pkg-config libjson-c-dev" && \
12+
apt-get -y update && \
13+
apt-get -y install iproute2 iputils-ping nano sqlite3 libjson-c4 $DEV_PACKAGES && \
14+
\
15+
# download and build strongSwan IKEv2 daemon
16+
mkdir /strongswan-build && \
17+
cd /strongswan-build && \
18+
wget https://download.strongswan.org/strongswan-$VERSION.tar.bz2 && \
19+
tar xfj strongswan-$VERSION.tar.bz2 && \
20+
cd strongswan-$VERSION && \
21+
./configure --prefix=/usr --sysconfdir=/etc --disable-defaults \
22+
--enable-charon --enable-ikev2 --enable-nonce --enable-random \
23+
--enable-openssl --enable-pkcs1 --enable-pkcs8 --enable-pkcs12 \
24+
--enable-pem --enable-x509 --enable-pubkey --enable-constraints \
25+
--enable-pki --enable-socket-default --enable-kernel-netlink \
26+
--enable-eap-identity --enable-eap-md5 --enable-eap-ttls \
27+
--enable-eap-tnc --enable-updown --enable-vici --enable-drbg \
28+
--enable-swanctl --enable-resolve --enable-silent-rules \
29+
--enable-tnccs-20 --enable-tnc-imv --enable-sqlite --enable-imv-os \
30+
--enable-imv-swima --enable-imv-scanner --enable-imv-attestation && \
31+
make all && make install && \
32+
cd / && rm -R strongswan-build && \
33+
ln -s /usr/libexec/ipsec/charon charon && mkdir /etc/pts && \
34+
TMPL="/usr/share/strongswan/templates/database/imv" && \
35+
cat $TMPL/tables.sql $TMPL/data.sql | sqlite3 /etc/pts/config.db && \
36+
\
37+
# clean up
38+
apt-get -y remove $DEV_PACKAGES && \
39+
apt-get -y autoremove && \
40+
apt-get clean && \
41+
rm -rf /var/lib/apt/lists/*
42+
43+
# Expose IKE and NAT-T ports
44+
EXPOSE 500 4500

tnc/README.md

+159
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
# tnc
2+
3+
Build and run both a TNC Client and a TNC Server collocated with a [strongSwan][STRONGSWAN]
4+
IKEv2 Daemon managed via the Versatile IKE Control Interface (VICI).
5+
6+
[STRONGSWAN]: https://www.strongswan.org
7+
8+
## Pull Docker Images
9+
10+
```
11+
$ docker pull strongx509/tnc-client
12+
$ docker pull strongX509/tnc-server
13+
```
14+
15+
## Build Docker Image
16+
17+
Alternatively the docker image can be built from scratch in the `tnc` directory with
18+
```console
19+
$ docker build -f Dockerfile.client -t strongx509/tnc-client .
20+
$ docker build -f Dockerfile.server -t strongx509/tnc-server .
21+
22+
```
23+
The build rules are defined in [Dockerfile.client](Dockerfile.client) and
24+
[Dockerfile.server](Dockerfile.server), respectively.
25+
26+
## Create Docker Containers and Local Networks
27+
28+
29+
```
30+
+----------------+ +----------------+
31+
10.3.0.1 --- | VPN/TNC Client | === 192.168.0.0/24 === | VPN/TNC Server | --- 10.1.0.0/16
32+
Virtual IP +----------------+ .3 Internet .2 +----------------+ .2 Intranet
33+
```
34+
The two docker containers `tnc-server` and `tnc-client` as well as the local networks
35+
`strongswan_internet` and `strongswan_intranet` are created with the command
36+
```console
37+
$ docker-compose up
38+
Creating tnc-server ... done
39+
Creating tnc-client ... done
40+
Attaching to tnc-server, tnc-client
41+
42+
```
43+
with the setup defined in [docker-compose.yml](docker-compose.yml).
44+
45+
In an additional console window we open a `bash` shell to start and manage the strongSwan `charon` daemon in the `tnc-server` container
46+
```console
47+
server$ docker exec -ti tnc-server /bin/bash
48+
server# ./charon &
49+
# ./charon &
50+
00[DMN] Starting IKE charon daemon (strongSwan 5.9.5, Linux 5.13.0-35-generic, x86_64)
51+
00[TNC] TNC recommendation policy is 'default'
52+
00[TNC] loading IMVs from '/etc/tnc_config'
53+
00[TNC] added IETF attributes
54+
00[TNC] added ITA-HSR attributes
55+
00[TNC] added PWG attributes
56+
00[TNC] added TCG attributes
57+
00[LIB] libimcv initialized
58+
00[IMV] IMV 1 "OS" initialized
59+
00[TNC] IMV 1 supports 1 message type: 'IETF/Operating System' 0x000000/0x00000001
60+
00[TNC] IMV 1 "OS" loaded from '/usr/lib/ipsec/imcvs/imv-os.so'
61+
00[IMV] IMV 2 "Scanner" initialized
62+
00[TNC] IMV 2 supports 1 message type: 'IETF/Firewall' 0x000000/0x00000005
63+
00[TNC] IMV 2 "Scanner" loaded from '/usr/lib/ipsec/imcvs/imv-scanner.so'
64+
```
65+
The `OS` and `Scanner` Integrity Measurement Verifiers (`IMVs`) are loaded since
66+
they have been enabled in `/etc/tnc_config`.
67+
```console
68+
00[LIB] loaded plugins: charon random nonce x509 constraints pubkey pkcs1 pkcs8 pkcs12 pem openssl drbg sqlite kernel-netlink resolve socket-default vici updown eap-identity eap-md5 eap-ttls eap-tnc tnc-imv tnc-tnccs tnccs-20
69+
00[JOB] spawning 16 worker threads
70+
71+
00[DMN] executing start script 'creds' (swanctl --load-creds)
72+
01[CFG] loaded certificate 'C=CH, O=Cyber, CN=server.strongswan.org'
73+
08[CFG] loaded certificate 'C=CH, O=Cyber, CN=Cyber Root CA'
74+
12[CFG] loaded ECDSA private key
75+
16[CFG] loaded EAP shared key with id 'eap-jane' for: 'jane'
76+
09[CFG] loaded EAP shared key with id 'eap-hacker' for: 'hacker'
77+
00[DMN] creds: loaded certificate from '/etc/swanctl/x509/serverCert.pem'
78+
00[DMN] creds: loaded certificate from '/etc/swanctl/x509ca/caCert.pem'
79+
00[DMN] creds: loaded ECDSA key from '/etc/swanctl/ecdsa/serverKey.pem'
80+
00[DMN] creds: loaded eap secret 'eap-jane'
81+
00[DMN] creds: loaded eap secret 'eap-hacker'
82+
83+
00[DMN] executing start script 'conns' (swanctl --load-conns)
84+
07[CFG] added vici connection: tnc
85+
00[DMN] conns: loaded connection 'tnc'
86+
00[DMN] conns: successfully loaded 1 connections, 0 unloaded
87+
88+
00[DMN] executing start script 'pools' (swanctl --load-pools)
89+
08[CFG] added vici pool rw_pool: 10.3.0.0, 254 entries
90+
00[DMN] pools: loaded pool 'rw_pool'
91+
00[DMN] pools: successfully loaded 1 pools, 0 unloaded
92+
```
93+
And in a third console window we open a `bash`shell to start and manage the strongSwan `charon` daemon in the `tnc-client` container
94+
```console
95+
client$ docker exec -ti tnc-client /bin/bash
96+
client# ./charon &
97+
00[DMN] Starting IKE charon daemon (strongSwan 5.9.5, Linux 5.13.0-35-generic, x86_64)
98+
00[TNC] loading IMCs from '/etc/tnc_config'
99+
00[TNC] added IETF attributes
100+
00[TNC] added ITA-HSR attributes
101+
00[TNC] added PWG attributes
102+
00[TNC] added TCG attributes
103+
00[LIB] libimcv initialized
104+
00[IMC] IMC 1 "OS" initialized
105+
00[IMC] processing "/etc/os-release" file
106+
00[IMC] operating system type is 'Ubuntu'
107+
00[IMC] operating system name is 'Ubuntu'
108+
00[IMC] operating system version is '20.04 x86_64'
109+
00[TNC] IMC 1 supports 1 message type: 'IETF/Operating System' 0x000000/0x00000001
110+
00[TNC] IMC 1 "OS" loaded from '/usr/lib/ipsec/imcvs/imc-os.so'
111+
00[IMC] IMC 2 "Scanner" initialized
112+
00[TNC] IMC 2 supports 1 message type: 'IETF/Firewall' 0x000000/0x00000005
113+
00[TNC] IMC 2 "Scanner" loaded from '/usr/lib/ipsec/imcvs/imc-scanner.so'
114+
```
115+
The `OS` and `Scanner` Integrity Measurement Collectors (`IMCs`) are loaded since
116+
they have been enabled in `/etc/tnc_config`.
117+
```console
118+
00[LIB] loaded plugins: charon random nonce x509 constraints pubkey pkcs1 pkcs8 pkcs12 pem openssl drbg sqlite kernel-netlink resolve socket-default vici updown eap-identity eap-md5 eap-ttls eap-tnc tnc-imc tnc-tnccs tnccs-20
119+
00[JOB] spawning 16 worker threads
120+
121+
00[DMN] executing start script 'creds' (swanctl --load-creds)
122+
01[CFG] loaded certificate 'C=CH, O=Cyber, CN=client.strongswan.org'
123+
09[CFG] loaded certificate 'C=CH, O=Cyber, CN=Cyber Root CA'
124+
11[CFG] loaded ECDSA private key
125+
01[CFG] loaded EAP shared key with id 'eap-hacker' for: 'hacker'
126+
00[DMN] creds: loaded certificate from '/etc/swanctl/x509/clientCert.pem'
127+
00[DMN] creds: loaded certificate from '/etc/swanctl/x509ca/caCert.pem'
128+
00[DMN] creds: loaded ECDSA key from '/etc/swanctl/ecdsa/clientKey.pem'
129+
00[DMN] creds: loaded eap secret 'eap-hacker'
130+
131+
00[DMN] executing start script 'conns' (swanctl --load-conns)
132+
05[CFG] added vici connection: tnc
133+
00[DMN] conns: loaded connection 'tnc'
134+
00[DMN] conns: successfully loaded 1 connections, 0 unloaded
135+
no pools found, 0 unloaded
136+
```
137+
The setup defines the EAP-TTLS-based configuration `tnc` .
138+
```console
139+
client# swanctl --list-conns
140+
```
141+
```console
142+
tnc: IKEv2, no reauthentication, rekeying every 14400s
143+
local: %any
144+
remote: 192.168.0.2
145+
local EAP_TTLS authentication:
146+
eap_id: client.strongswan.org
147+
remote EAP_TTLS authentication:
148+
id: server.strongswan.org
149+
tnc: TUNNEL, rekeying every 3600s
150+
local: dynamic
151+
remote: 10.1.0.0/16 192.168.0.2/32
152+
153+
```
154+
155+
Author: [Andreas Steffen][AS] [CC BY 4.0][CC]
156+
157+
[AS]: mailto:[email protected]
158+
[CC]: http://creativecommons.org/licenses/by/4.0/
159+

tnc/caKey.pem

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MIGkAgEBBDAjNX0721bMFzAxAkJBDgi0rZS42Z2f+ioWQL2gdVke1+/vuI6pvOs0
3+
ozsASY+GmOigBwYFK4EEACKhZANiAARpFOA0dr+prcP+aO8ev8Kvh/bQoeIbOVqs
4+
BeecOQNSdPv9gShYECiFiokU4565RzV2wiFdAU39VUs/4bJ/SlK7bvY3HuMDcjAR
5+
FXXZbtxXbdg1QlWk1alja3rVRaId6Hg=
6+
-----END EC PRIVATE KEY-----

tnc/client/ecdsa/clientKey.pem

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MIGkAgEBBDBMPJ2vR/MPIxvNxCtI4jwU+vEykd8OVbqF88h7kmwZg62Jszj0j06b
3+
7k3Tim2KKTigBwYFK4EEACKhZANiAATtv3hJtqlsOU1CciT03FFi0S+BMWhDCove
4+
OLlLBY2xE/Cic+s//fLn7g3UzEG2DPdB++7emFOMlnKBRnhg3sbxejiRFdnjwILZ
5+
xWo/htyKoB1zbU2ALmjdZV+rQLGZPec=
6+
-----END EC PRIVATE KEY-----

tnc/client/swanctl.conf

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
connections {
2+
3+
tnc {
4+
remote_addrs = 192.168.0.2
5+
vips = 0.0.0.0
6+
7+
local {
8+
auth = eap-ttls
9+
# used with certificate-based EAP-TLS client authenticaton
10+
eap_id = client.strongswan.org
11+
# used with password-based EAP-MD5 client authentication
12+
# eap_id = hacker
13+
}
14+
remote {
15+
auth = eap-ttls
16+
id = server.strongswan.org
17+
}
18+
children {
19+
tnc {
20+
remote_ts = 10.1.0.0/16,192.168.0.2
21+
esp_proposals = aes256gcm128-x25519
22+
}
23+
}
24+
version = 2
25+
proposals = aes256-sha256-x25519
26+
send_certreq = no
27+
}
28+
}
29+
30+
secrets {
31+
32+
eap-hacker {
33+
id = hacker
34+
secret = K8FW9/N0VIAJ
35+
}
36+
}

tnc/client/x509/clientCert.pem

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIB/zCCAYWgAwIBAgIICmApmnHxbpUwCgYIKoZIzj0EAwMwNTELMAkGA1UEBhMC
3+
Q0gxDjAMBgNVBAoTBUN5YmVyMRYwFAYDVQQDEw1DeWJlciBSb290IENBMB4XDTIw
4+
MDMwOTEzNTkwNloXDTI0MDMwOTEzNTkwNlowPTELMAkGA1UEBhMCQ0gxDjAMBgNV
5+
BAoTBUN5YmVyMR4wHAYDVQQDExVjbGllbnQuc3Ryb25nc3dhbi5vcmcwdjAQBgcq
6+
hkjOPQIBBgUrgQQAIgNiAATtv3hJtqlsOU1CciT03FFi0S+BMWhDCoveOLlLBY2x
7+
E/Cic+s//fLn7g3UzEG2DPdB++7emFOMlnKBRnhg3sbxejiRFdnjwILZxWo/htyK
8+
oB1zbU2ALmjdZV+rQLGZPeejWjBYMB8GA1UdIwQYMBaAFLjSYIqHz0jucV3YUSAj
9+
WsGq5feyMCAGA1UdEQQZMBeCFWNsaWVudC5zdHJvbmdzd2FuLm9yZzATBgNVHSUE
10+
DDAKBggrBgEFBQcDAjAKBggqhkjOPQQDAwNoADBlAjACrgXJrY3RoERgbfD++vvY
11+
8If1P9acT4JDbcTsLNDCgrqooCpU6nawP7Vp5eEbkyoCMQCr+VshJEge7smR6jkZ
12+
VAqo4N5Zm/GWqCgfJVsmtlie1o4m+cwhpiM2axUIA0osTP8=
13+
-----END CERTIFICATE-----

tnc/client/x509ca/caCert.pem

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIB3zCCAWWgAwIBAgIIWWpjqeLZ9K8wCgYIKoZIzj0EAwMwNTELMAkGA1UEBhMC
3+
Q0gxDjAMBgNVBAoTBUN5YmVyMRYwFAYDVQQDEw1DeWJlciBSb290IENBMB4XDTIw
4+
MDMwOTEyMDIwOVoXDTMwMDMwOTEyMDIwOVowNTELMAkGA1UEBhMCQ0gxDjAMBgNV
5+
BAoTBUN5YmVyMRYwFAYDVQQDEw1DeWJlciBSb290IENBMHYwEAYHKoZIzj0CAQYF
6+
K4EEACIDYgAEaRTgNHa/qa3D/mjvHr/Cr4f20KHiGzlarAXnnDkDUnT7/YEoWBAo
7+
hYqJFOOeuUc1dsIhXQFN/VVLP+Gyf0pSu272Nx7jA3IwERV12W7cV23YNUJVpNWp
8+
Y2t61UWiHeh4o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd
9+
BgNVHQ4EFgQUuNJgiofPSO5xXdhRICNawarl97IwCgYIKoZIzj0EAwMDaAAwZQIw
10+
PR1T8MHS+aV9qSueIE9QfPRgEVyvuaz2g4q7DN51SUfypjYoAX+B6BqiR7vfgY2Y
11+
AjEA65R8XZy0N6LEYgAEPPbQSyCdJudoa4MwidaomSwwgiVDePN356onk/lhURmE
12+
QBaZ
13+
-----END CERTIFICATE-----

tnc/docker-compose.yml

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
version: "3"
2+
3+
services:
4+
vpn-server:
5+
image: strongx509/tnc-server:5.9.5
6+
container_name: tnc-server
7+
cap_add:
8+
- NET_ADMIN
9+
- SYS_ADMIN
10+
- SYS_MODULE
11+
stdin_open: true
12+
tty: true
13+
volumes:
14+
- ./server:/etc/swanctl
15+
- ./strongswan.conf.server:/etc/strongswan.conf
16+
- ./tnc_config.server:/etc/tnc_config
17+
networks:
18+
internet:
19+
ipv4_address: 192.168.0.2
20+
intranet:
21+
ipv4_address: 10.1.0.2
22+
vpn-client:
23+
image: strongx509/tnc-client:5.9.5
24+
container_name: tnc-client
25+
depends_on:
26+
- vpn-server
27+
cap_add:
28+
- NET_ADMIN
29+
- SYS_ADMIN
30+
- SYS_MODULE
31+
stdin_open: true
32+
tty: true
33+
volumes:
34+
- ./client:/etc/swanctl
35+
- ./strongswan.conf.client:/etc/strongswan.conf
36+
- ./tnc_config.client:/etc/tnc_config
37+
networks:
38+
internet:
39+
ipv4_address: 192.168.0.3
40+
41+
networks:
42+
internet:
43+
ipam:
44+
driver: default
45+
config:
46+
- subnet: 192.168.0.0/24
47+
intranet:
48+
ipam:
49+
driver: default
50+
config:
51+
- subnet: 10.1.0.0/16

0 commit comments

Comments
 (0)