Power Systems Virtual Server on IBM Cloud (AIX) で IP フィルタリングを実装する


#インターネットから Power Systems Virtual Server へのアクセス

- 「External IP」を使ったインターネットアクセスは有効/無効を選択することができます。
- 外部公開用途ではなく、管理用途での利用のみが想定されています。
- 「External IP」は OS に直接割り当てられるのではなく、IBM Cloud (x86) 上に割り当てられます。「External IP」へのアクセスは、vSRX で NAT されて、IBM Cloud が管理する専用線経由で Power Systems Virtual Serverにアクセスされます。
- 前段に FW が構成されており、SSH(22)、HTTPS(443)、Ping(no Port)、 IBM i 5250 terminal emulation with SSL (992) 以外の通信はブロックされています。

>[Network security](https://cloud.ibm.com/docs/infrastructure/power-iaas?topic=power-iaas-network-security)
>The public Power Systems™ Virtual Server network security architecture relies on a set of fixed firewall ports open on the Juniper vSRX firewalls:

> - 22 (SSH)
> - 443 (HTTPS)
> - 992 (IBM i5250 emulation SSL)
> - ICMP traffic

![Kobito.WZjBN6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/03367962-afbe-440b-1905-b6a8304f6ab5.png "Kobito.WZjBN6.png")

# IP フィルタリングとは
管理用途での利用を想定した場合でも、拠点からアクセスのみ許可したいことはよくあるので、この機能の実装を確認します。

>[IP セキュリティー・フィーチャーのインストール](https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_72/security/ipsec_installation.html)
>AIX の IP セキュリティー・フィーチャーは、個別にインストールしてロードすることができます。
>インストールする必要があるのは、次のファイルセットです。

> - bos.net.ipsec.rte (カーネル IP セキュリティー環境用のランタイム環境とコマンド)
> - bos.msg.LANG.net.ipsec (LANG は指定する言語、例えば en_US)
> - bos.net.ipsec.keymgt
> - clic.rte (C 用の CryptoLite、 DES、triple DES および AES 暗号化用のファイルセット)

# 環境準備
Power Systems Virtual Server on IBM Cloud (AIX) のデフォルト構成を確認します。

```
# uname -M
IBM,9009-22A
# oslevel -s
7200-04-01-1939
```

以下の場合だと、「External IP」は内部で `192.168.2.164` に変換されるので、このアドレスをルールの記述に使用します。

![Kobito.UV8xXu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/25fe3ad4-941e-6bfc-edd2-638181aee1c5.png "Kobito.UV8xXu.png")

また、インターネットからのアクセスには `en0` が使われているので、このインターフェースをルールの記述に使用します。

```
# ifconfig -a
en0: flags=1e084863,814c0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),LARGESEND,CHAIN>
        inet 192.168.2.164 netmask 0xfffffff0 broadcast 192.168.2.175
         tcp_sendspace 262144 tcp_recvspace 262144 rfc1323 1
en1: flags=1e084863,814c0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),LARGESEND,CHAIN>
        inet 192.168.200.10 netmask 0xffffff00 broadcast 192.168.200.255
         tcp_sendspace 262144 tcp_recvspace 262144 rfc1323 1
en2: flags=1e084863,814c0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),LARGESEND,CHAIN>
        inet6 fe80::c8f2:fdff:fe8b:1e3b/64
         tcp_sendspace 262144 tcp_recvspace 262144 rfc1323 1
sit0: flags=8100041<UP,RUNNING,LINK0>
        inet6 ::/96
lo0: flags=e08084b,c0<UP,BROADCAST,LOOPBACK,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,LARGESEND,CHAIN>
        inet 127.0.0.1 netmask 0xff000000 broadcast 127.255.255.255
        inet6 ::1%1/128
         tcp_sendspace 131072 tcp_recvspace 131072 rfc1323 1
```

IP フィルタリング機能の要件になっている `bos.msg.LANG.net.ipsec` はデフォルトでインストールされていないので、以下のコマンドで `/usr/sys/inst.images` からインストールします。

```
# installp -L -d /usr/sys/inst.images | grep bos.msg.en_US.net.ipsec
bos.msg.en_US:bos.msg.en_US.net.ipsec:7.2.4.0::I:C:::::N:IP Security Messages - U.S. English ::::0:1937:
# installp -acg -d /usr/sys/inst.images bos.msg.en_US.net.ipsec
# lslpp -Lc | grep "bos.msg.en_US.net.ipsec"
bos.msg.en_US:bos.msg.en_US.net.ipsec:7.2.4.0: : :C: :IP Security Messages - U.S. English : : : : : : :0:0:/:1937
```

その他のファイルセットは、デフォルトでインストールされていることが確認できます。

```
# lslpp -Lc | grep "bos.net.ipsec.*"
bos.net:bos.net.ipsec.keymgt:7.2.4.0: : :C: :IP Security Key Management : : : : : : :1:0:/:1937
bos.net:bos.net.ipsec.rte:7.2.4.0: : :C: :IP Security : : : : : : :1:0:/:1937
```

```
# lslpp -Lc | grep "clic.rte.*"
clic.rte:clic.rte.kernext:4.10.0.2: : :C: :CryptoLite for C Kernel: : : : : : :1:0:/:
clic.rte:clic.rte.lib:4.10.0.2: : :C: :CryptoLite for C Library: : : : : : :1:0:/:
```

# IP フィルタリングログ設定

フィルタリングの挙動をログで確認できるように、事前に設定します。

```
# cp /etc/syslog.conf /etc/syslog.conf.bak
# echo "local4.debug /var/adm/ipsec.log" >> /etc/syslog.conf
# touch /var/adm/ipsec.log
# chmod 644 /var/adm/ipsec.log
# refresh -s syslogd
0513-095 The request for subsystem refresh was completed successfully.
```

# IP フィルタリング設定
デバイス追加のコマンドで機能を有効化します。

```
# mkdev -c ipsec -t 4 
ipsec_v4 Available
```

デフォルトアクションを許可 (`P`) でルールを適用します。

```
# mkfilt -v 4 -u -z P
Default rule for IPv4 in ODM has been changed.
Successfully set default action to PERMIT
```

拠点クライアント（203.x.x.x/24 のグローバルIP）からSSHリクエストを許可するルールを作成します。

```
# genfilt \
-v 4 \
-a P \
-s 203.x.x.x \
-m 255.255.255.0 \
-d 192.168.2.164 \
-M 255.255.255.240 \
-g N \
-c tcp \
-o gt \
-p 1023 \
-O eq \
-P 22 \
-r L \
-w I \
-l N \
-f Y \
-i en0
Filter rule 3 for IPv4 has been added successfully.
```

SSHサーバーから拠点クライアント（203.x.x.x/24 のグローバルIP）への応答を許可するルールを作成します。

```
genfilt \
-v 4 \
-a P \
-s 192.168.2.164 \
-m 255.255.255.240 \
-d 203.x.x.x \
-M 255.255.255.0 \
-g N \
-c tcp/ack \
-o eq \
-p 22 \
-O gt \
-P 1023 \
-r L \
-w O \
-l N \
-f Y \
-i en0
Filter rule 4 for IPv4 has been added successfully.
```

上記以外のその他のアクセスを拒否し、ログを残すルールを作成します。

```
# genfilt \
-v 4 \
-a D \
-s 0 \
-m 0 \
-d 192.168.2.164 \
-M 255.255.255.240 \
-g N \
-c tcp \
-O eq \
-P 22 \
-r L \
-w I \
-l Y \
-f Y \
-i en0
Filter rule 5 for IPv4 has been added successfully.
```

以下のコマンドでルールのリスト表示が確認できます。

```
# lsfilt -v 4 -O
1|permit|0.0.0.0|0.0.0.0|0.0.0.0|0.0.0.0|no|udp|eq|4001|eq|4001|both|both|no|all packets|0|all|0|||Default Rule
2|*** Dynamic filter placement rule for IKE tunnels ***|no
3|permit|203.x.x.x|255.255.255.0|192.168.2.164|255.255.255.240|no|tcp|gt|1023|eq|22|local|inbound|no|all packets|0|en0|0|||
4|permit|192.168.2.164|255.255.255.240|203.x.x.x|255.255.255.0|no|tcp/ack|eq|22|gt|1023|local|outbound|no|all packets|0|en0|0|||
5|deny|0.0.0.0|0.0.0.0|192.168.2.164|255.255.255.240|no|tcp|any|0|eq|22|local|inbound|yes|all packets|0|en0|0|||
0|deny|0.0.0.0|0.0.0.0|0.0.0.0|0.0.0.0|yes|all|any|0|any|0|both|both|no|all packets|0|all|0|||Default Rule
```

`/var/adm/ipsec.log` にログ出力を開始します。

```
# mkfilt -v 4 -g start
```

デフォルトアクションを拒否 (`D`) でルールを適用します。
これまでに作成したルールもここで適用されるので注意してください。

```
# mkfilt -v 4 -u -z D
Default rule for IPv4 in ODM has been changed.
Successfully set default action to DENY
```

これで特定の拠点（203.x.x.x/24 のグローバルIP）からSSHアクセスのみ許可する実装ができました。
以下の DENY ログ (`R:d`) からも認可されていないアクセスを確認できます。

```
# tail -f /var/adm/ipsec.log
Feb 14 08:57:01 khayama-aix local4:notice : mkfilt: Filter rules updated at 08:57:01 on 02/14/20 
Feb 14 08:57:01 khayama-aix local4:notice : mkfilt: #:1 not known 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 (0) ??? 0 ??? 0  both both l=n f=n t=0 t_exp=0
Feb 14 08:57:01 khayama-aix local4:notice : mkfilt: #:2 PERMIT 203.x.x.x 255.255.255.0 192.168.2.164 255.255.255.240 tcp     gt  1023 eq  22 en0 local inbound l=n f=y t=0 t_exp=0
Feb 14 08:57:01 khayama-aix local4:notice : mkfilt: #:3 PERMIT 192.168.2.164 255.255.255.240 203.x.x.x 255.255.255.0 tcp/ack eq  22 gt  1023 en0 local outbound l=n f=y t=0 t_exp=0
Feb 14 08:57:01 khayama-aix local4:notice : mkfilt: #:4 DENY 0.0.0.0 0.0.0.0 192.168.2.164 255.255.255.240 tcp     any 0 eq  22 en0 local inbound l=y f=y t=0 t_exp=0
Feb 14 08:57:01 khayama-aix local4:notice : mkfilt: #:5 DENY 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 all any 0 any 0  both both l=n f=y t=0 t_exp=0
Feb 14 09:01:18 khayama-aix local4:info ipsec_logd: #:4 R:d  I:192.168.2.164 S:195.x.x.x D:192.168.2.164 P:tcp/ack SP:41713 DP:22 R:l I:en0 F:n T:0 L:56  
Feb 14 09:01:21 khayama-aix local4:info ipsec_logd: #:4 R:d  I:192.168.2.164 S:195.x.x.x D:192.168.2.164 P:tcp/ack SP:41713 DP:22 R:l I:en0 F:n T:0 L:56  
Feb 14 09:01:27 khayama-aix local4:info ipsec_logd: #:4 R:d  I:192.168.2.164 S:195.x.x.x D:192.168.2.164 P:tcp/ack SP:41713 DP:22 R:l I:en0 F:n T:0 L:52
Feb 14 09:05:11 khayama-aix local4:info ipsec_logd: #:4 R:d  I:192.168.2.164 S:202.x.x.x D:192.168.2.164 P:tcp/ack SP:34454 DP:22 R:l I:en0 F:n T:0 L:64  
Feb 14 09:05:19 khayama-aix local4:info last message repeated 3 times
Feb 14 09:16:48 khayama-aix local4:info ipsec_logd: #:4 R:d  I:192.168.2.164 S:121.x.x.x D:192.168.2.164 P:tcp/ack SP:65067 DP:22 R:l I:en0 F:n T:0 L:68  
```

# IP フィルタリングでつながらなくなったら
ポータル画面からコンソールを起動できます。

![Kobito.Ipc04U.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/21f6f72c-3fbe-e658-e534-c7a7821223b6.png "Kobito.Ipc04U.png")

`root` というユーザー名でログインして該当ルールを削除・適用しましょう。

![Kobito.qNR9Tu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/9a6bdb70-ed52-2fc7-4009-66550a912798.png "Kobito.qNR9Tu.png")

# 参考

- [AIX – Getting OS Versions | /bin/help LINUX REFERENCE](https://linuxreference.wordpress.com/2011/06/21/aix-getting-os-versions/)
- [Setting up a firewall with AIX TCP/IP filtering – IBM Developer](https://developer.ibm.com/articles/au-aixfiltering/)
- [Unix swing: Sample firewall in AIX](https://unixswing.blogspot.com/2019/03/sample-firewall-in-aix.html)
- [静的フィルター・ルール](https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_72/security/ipsec_static_filter_rules.html)
- [genfilt コマンド](https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_72/g_commands/genfilt.html)

```:ルール3のログをなしに変更
# chfilt -v 4 -n 3 -l N
Filter rule 3 for IPv4 has been changed successfully.
```

```:ルール4を削除
# rmfilt -v 4 -n 4
Filter rule 4 for IPv4 has been removed successfully.
```

```:ログ出力を停止
# mkfilt -v 4 -g stop
```

```:作成・変更したルールの適用
# mkfilt -v 4 -u
```