Raspberry Pi 2のセキュリティ設定を強化する

Sat Jan 7, 2017 in server using tags raspberrypi , home-network , homepot1

FortiGate 60DとRaspberry Piを使用して家庭内インターネット接続環境を構築します。 最終的には以下のような構成を想定しています。

前回に引き続きhomepot1を構築していきます。 Cowrieを使用するにあたりやっておきたいセキュリティ設定を行っていきます。

IPv6の無効化

IPv6は使用しないため、IPv6を無効化します。

$ sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.all.disable_ipv6 = 1
$
$ sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6 = 1
$
$ sudo sysctl -a | grep disable_ipv6
sysctl: reading key "net.ipv6.conf.all.stable_secret"
net.ipv6.conf.all.disable_ipv6 = 1
sysctl: reading key "net.ipv6.conf.default.stable_secret"
net.ipv6.conf.default.disable_ipv6 = 1
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
net.ipv6.conf.eth0.disable_ipv6 = 1
sysctl: reading key "net.ipv6.conf.eth1.stable_secret"
net.ipv6.conf.eth1.disable_ipv6 = 1
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
net.ipv6.conf.lo.disable_ipv6 = 1
$

再起動後もIPv6が無効化するように設定します。

$ sudo vi /etc/sysctl.d/10-disableipv6.conf
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1

SELinuxの無効化

Raspbian(Jessie)ではデフォルトでSELinuxが使えないようなので、特にやることなし。

iptablesの設定

iptablesでfirewallを設定します。

#Cowrieポートのポートフォワード(別手順で設定済み)
#$ sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222

##INPUTチェーン
#IPスプーフィング対策
$ sudo iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset

#セッションハイジャック対策
$ sudo iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

#不正なパケット拒否
$ sudo iptables -A INPUT -m state --state INVALID -j DROP

#内部からの通信を始めた場合のパケットは許可
$ sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#ループバックからの通信は通す
$ sudo iptables -A INPUT -i lo -j ACCEPT

#ICMPパケットは許可
$ sudo iptables -A INPUT -p icmp -j ACCEPT

#DHCPクライアントとしてDHCPに必要な通信は通す
#$ sudo iptables -A INPUT -p udp --dport 67 --sport 68 -j ACCEPT

#SSH(20022/tcp)は許可(ローカルネットワークからの接続のみ許可)
$ sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.10.0/24 --dport 20022 -j ACCEPT

#HTTPは許可(ローカルネットワークからの接続のみ許可)
$ sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.10.0/24 --dport 80 -j ACCEPT

#Cowrieは許可(5回まで新規接続許可。それ以降は1分に1回に制限。10分間無接続なら制限解除)
$ sudo iptables -A INPUT -p tcp --dport 2222 -m state --state NEW -m hashlimit --hashlimit-name ssh_limit --hashlimit 1/m --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-htable-expire 600000 -j ACCEPT

#Zabbix-Agentへの通信は許可
#$ sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.30.0/24 --dport 10050 -j ACCEPT

##OUTPUTチェーン
#ループバックへの通信は通す
$ sudo iptables -A OUTPUT -o lo -j ACCEPT

#ICMP応答のパケットは通す
$ sudo iptables -A OUTPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT

#外部からの通信を始めた場合のパケットを許可
$ sudo iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#tcp-resetの通信は通す
$ sudo iptables -A OUTPUT -p tcp --tcp-flags FIN,SYN,RST RST -m state --state ESTABLISHED,RELATED -j ACCEPT

#DHCPクライアントとしてDHCPに必要な通信は通す
#$ sudo iptables -A OUTPUT -p udp --dport 68 --sport 67 -j ACCEPT

#ユーザrootが発したパケットは許可
$ sudo iptables -A OUTPUT -m owner --uid-owner 0 -j ACCEPT

#NTPは許可
$ sudo iptables -A OUTPUT -m state --state NEW -m udp -p udp --dport 123 -j ACCEPT

#Zabbix-Serverへの通信は許可
#$ sudo iptables -A OUTPUT -m state --state NEW -m tcp -p tcp -d 192.168.30.0/24 --dport 10051 -j ACCEPT

#外部からの通信は拒否。外部への通信も拒否。
$ sudo iptables -P INPUT DROP
$ sudo iptables -P FORWARD DROP
$ sudo iptables -P OUTPUT DROP

iptablesの設定を保存します。

$ sudo netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save
$

ログ出力先をsyslogに変更

twistdの作成するログは1000000MB程度でログローテートされてしまうため、Syslogに出力するように変更して日次でログローテートするように変更します。

ログ保管用のディレクトリ作成

$ sudo mkdir /var/log/cowrie
$ sudo chown cowrie:adm /var/log/cowrie/

rsyslogの設定

$ sudo vi /etc/rsyslog.d/cowrie.conf
if $programname == 'cowrie' then /var/log/cowrie/cowrie.log
& ~

rsyslogの再起動

$ sudo systemctl restart rsyslog

Cowrieのログ出力先変更

$ sudo su - cowrie
$ cd cowrie
$ cp -p start.sh{,.backup20170107}
$ ls -l start.sh*
-rwxr-xr-x 1 cowrie cowrie 922  1月  5 05:21 start.sh
-rwxr-xr-x 1 cowrie cowrie 922  1月  4 21:10 start.sh.backup20170105
-rwxr-xr-x 1 cowrie cowrie 922  1月  5 05:21 start.sh.backup20170107
-rwxr-xr-x 1 cowrie cowrie 920  1月  4 19:05 start.sh.org
$
$ vi start.sh
$ diff start.sh.backup20170107 start.sh
35c35
<     twistd $XARGS $DAEMONIZE -l log/cowrie.log --umask 0027 --pidfile ${PIDFILE} cowrie
---
>     twistd $XARGS $DAEMONIZE --syslog --prefix cowrie --umask 0027 --pidfile ${PIDFILE} cowrie
37c37
<     authbind --deep twistd $DAEMONIZE $XARGS -l log/cowrie.log --umask 0027 --pidfile ${PIDFILE} cowrie
---
>     authbind --deep twistd $DAEMONIZE $XARGS --syslog --prefix cowrie --umask 0027 --pidfile ${PIDFILE} cowrie
$

logrotateの設定

logrotateをインストールします(通常はインストール済みのはずです)。

$ sudo -E apt-get install logrotate
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
logrotate はすでに最新版です。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
$

Cowrie用のlogrotate設定を作成

$ sudo vi /etc/logrotate.d/cowrie
/var/log/cowrie/cowrie.log
{
        daily
        rotate 92
        dateext
        create 0640 cowrie adm
        missingok
        ifempty
        compress
        postrotate
                invoke-rc.d rsyslog rotate > /dev/null
        endscript
}

logrotateをテスト実行し、エラーがないことを確認

$ sudo logrotate -d /etc/logrotate.d/cowrie
reading config file /etc/logrotate.d/cowrie

Handling 1 logs

rotating pattern: /var/log/cowrie/cowrie.log
 after 1 days (92 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/cowrie/cowrie.log
  log /var/log/cowrie/cowrie.log does not exist -- skipping
$

logwatchのインストール

logwatchをインストール

$ sudo -E apt-get install logwatch
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  bsd-mailx exim4-base exim4-config exim4-daemon-light libdate-manip-perl
  liblockfile-bin liblockfile1 libsys-cpu-perl
提案パッケージ:
  mail-reader eximon4 exim4-doc-html exim4-doc-info spf-tools-perl swaks
  fortune-mod
推奨パッケージ:
  mailx
以下のパッケージが新たにインストールされます:
  bsd-mailx exim4-base exim4-config exim4-daemon-light libdate-manip-perl
  liblockfile-bin liblockfile1 libsys-cpu-perl logwatch
アップグレード: 0 個、新規インストール: 9 個、削除: 0 個、保留: 0 個。
3,532 kB のアーカイブを取得する必要があります。
この操作後に追加で 17.1 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main liblockfile-bin armhf 1.09-6 [18.2 kB]
取得:2 http://mirrordirector.raspbian.org/raspbian/ jessie/main liblockfile1 armhf 1.09-6 [14.7 kB]
取得:3 http://mirrordirector.raspbian.org/raspbian/ jessie/main exim4-config all 4.84.2-2+deb8u2 [503 kB]
取得:4 http://mirrordirector.raspbian.org/raspbian/ jessie/main exim4-base armhf 4.84.2-2+deb8u2 [1,046 kB]
取得:5 http://mirrordirector.raspbian.org/raspbian/ jessie/main exim4-daemon-light armhf 4.84.2-2+deb8u2 [578 kB]
取得:6 http://mirrordirector.raspbian.org/raspbian/ jessie/main bsd-mailx armhf 8.1.2-0.20141216cvs-2 [74.3 kB]
取得:7 http://mirrordirector.raspbian.org/raspbian/ jessie/main libdate-manip-perl all 6.47-1 [923 kB]
取得:8 http://mirrordirector.raspbian.org/raspbian/ jessie/main libsys-cpu-perl armhf 0.61-1+b1 [9,800 B]
取得:9 http://mirrordirector.raspbian.org/raspbian/ jessie/main logwatch all 7.4.1-2 [365 kB]
3,532 kB を 48秒 で取得しました (72.9 kB/s)                                    
パッケージを事前設定しています ...
以前に未選択のパッケージ liblockfile-bin を選択しています。
(データベースを読み込んでいます ... 現在 36617 個のファイルとディレクトリがインストールされています。)
.../liblockfile-bin_1.09-6_armhf.deb を展開する準備をしています ...
liblockfile-bin (1.09-6) を展開しています...
以前に未選択のパッケージ liblockfile1:armhf を選択しています。
.../liblockfile1_1.09-6_armhf.deb を展開する準備をしています ...
liblockfile1:armhf (1.09-6) を展開しています...
以前に未選択のパッケージ exim4-config を選択しています。
.../exim4-config_4.84.2-2+deb8u2_all.deb を展開する準備をしています ...
exim4-config (4.84.2-2+deb8u2) を展開しています...
以前に未選択のパッケージ exim4-base を選択しています。
.../exim4-base_4.84.2-2+deb8u2_armhf.deb を展開する準備をしています ...
exim4-base (4.84.2-2+deb8u2) を展開しています...
以前に未選択のパッケージ exim4-daemon-light を選択しています。
.../exim4-daemon-light_4.84.2-2+deb8u2_armhf.deb を展開する準備をしています ...
exim4-daemon-light (4.84.2-2+deb8u2) を展開しています...
以前に未選択のパッケージ bsd-mailx を選択しています。
.../bsd-mailx_8.1.2-0.20141216cvs-2_armhf.deb を展開する準備をしています ...
bsd-mailx (8.1.2-0.20141216cvs-2) を展開しています...
以前に未選択のパッケージ libdate-manip-perl を選択しています。
.../libdate-manip-perl_6.47-1_all.deb を展開する準備をしています ...
libdate-manip-perl (6.47-1) を展開しています...
以前に未選択のパッケージ libsys-cpu-perl を選択しています。
.../libsys-cpu-perl_0.61-1+b1_armhf.deb を展開する準備をしています ...
libsys-cpu-perl (0.61-1+b1) を展開しています...
以前に未選択のパッケージ logwatch を選択しています。
.../logwatch_7.4.1-2_all.deb を展開する準備をしています ...
logwatch (7.4.1-2) を展開しています...
man-db (2.7.0.2-5) のトリガを処理しています ...
systemd (215-17+deb8u5) のトリガを処理しています ...
liblockfile-bin (1.09-6) を設定しています ...
liblockfile1:armhf (1.09-6) を設定しています ...
exim4-config (4.84.2-2+deb8u2) を設定しています ...
Adding system-user for exim (v4)
exim4-base (4.84.2-2+deb8u2) を設定しています ...
exim: DB upgrade, deleting hints-db
exim4-daemon-light (4.84.2-2+deb8u2) を設定しています ...
bsd-mailx (8.1.2-0.20141216cvs-2) を設定しています ...
update-alternatives: /usr/bin/mailx (mailx) を提供するために自動モードで /usr/bin/bsd-mailx を使います
libdate-manip-perl (6.47-1) を設定しています ...
libsys-cpu-perl (0.61-1+b1) を設定しています ...
logwatch (7.4.1-2) を設定しています ...
libc-bin (2.19-18+deb8u6) のトリガを処理しています ...
systemd (215-17+deb8u5) のトリガを処理しています ...
$

logwatchの実行結果を確認

$ sudo logwatch --output stdout

以上