カメノドットコム
Debian大好きでメインで節操ない感じ。
GMOもわりと好き。
RSS feedly

ホームユースLinuxのセキュリティ(2)

ホームユースLinuxのセキュリティ」では、インストールしておくと危険、あるいは、自動起動させると危険なものについて書きました。
こちらでは、起動しっぱなしのほうが便利だなーというNTPサーバと、iptablesを使った防御についてです。

NTPサーバのインストール

ntpdate で時刻合わせしてましたが、ズンドコずれていきます。
NTPサーバだけはあえてインストールして残したいと思います。
ntpdate でもいいんだけど。システムクロックを合わせるのが面倒くさい。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install ntp

以上でNTPサーバのインストールは完了です。

NTPサーバの設定

NTPサーバの初期設定、タイムサーバは謎だしセキュリティもザルです。アクセスし放題。
下記を参考に書き換えてみてください。ザルではなくなります
ちなみに設定ファイルは「/etc/ntp.conf」です。

# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

driftfile /var/lib/ntp/ntp.drift

# Enable this if you want statistics to be logged.
#statsdir /var/log/ntpstats/

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

# You do need to talk to an NTP server or two (or three).
#server ntp.your-provider.example

# タイムサーバが遠いのでコメントアウト
# pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
# pick a different set every time it starts up.  Please consider joining the
# pool: 
#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst

# 日本のタイムサーバサーバを指定
server ntp.jst.mfeed.ad.jp      # インターネットマルチフィード (MFEED)
server ntp.ring.gr.jp           # Ring Server Project
server s2csntp.miz.nao.ac.jp    # 国立天文台・水沢VLBI観測所・天文保時室 (NAO)
server ntp.nict.jp              # 独立行政法人情報通信研究機構 (NICT)

# Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
# details.  The web page 
# might also be helpful.
#
# Note that "restrict" applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.

# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery

# 受付を設定
# Local users may interrogate the ntp server more closely.
#restrict 127.0.0.1         # コメントアウト
restrict default noquery    # 接続をすべて拒否
restrict localhost          # localhost のみ接続を許可
restrict ::1

# Clients from this (example!) subnet have unlimited access, but only if
# cryptographically authenticated.
#restrict 192.168.123.0 mask 255.255.255.0 notrust

# If you want to provide time to your local subnet, change the next line.
# (Again, the address is an example only.)
#broadcast 192.168.123.255

# If you want to listen to time broadcasts on your local subnet, de-comment the
# next lines.  Please do this only if you trust everybody on the network!
#disable auth
#broadcastclient

# モニタリングさせない設定を追加
disable monitor

設定ファイルを書き換えましたら、NTPサーバを再起動してタイムサーバとの同期を確認します。

$ sudo /etc/init.d/ntp restart
$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ntp1.jst.mfeed. 133.243.236.17   2 u   23   64    1   27.909    6.084   0.000
 ntp1.hpcc.jp    .INIT.          16 u    -   64    0    0.000    0.000   0.000
 133.40.41.135   133.40.41.133    2 u   21   64    1   32.879    0.503   0.000
 ntp-a2.nict.go. .NICT.           1 u   20   64    1   34.514    0.667   0.000

まだどことも同期してませんね。数分置いて再確認します。

$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+ntp1.jst.mfeed. 133.243.236.17   2 u   36   64  177   19.712   -2.298   3.177
 ntp1.hpcc.jp    .INIT.          16 u    -  512    0    0.000    0.000   0.000
+133.40.41.135   133.40.41.133    2 u   39   64  277   27.160   -3.191   5.399
*ntp-a2.nict.go. .NICT.           1 u   38   64  177   19.889   -1.573   1.288

あちこちと同期を始めました。これでいつも時刻は正確です。
apt とか make とか、時刻がずれ過ぎるとうまくいかないんですよね。
数秒程度なら大丈夫なんですけど。

iptablesをインストールする

これさえきちんとすれば、実はtelnetもsshもBINDも大丈夫なんじゃね? と思える威力。
Debian系でのインストール方法と設定方法になります。
設定は他のもあんまり変わらないんじゃないかと思います。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install iptables iptables-persistent

インストール中に「保存しますか?」と聞かれるので、とりあえず保存しときます。
デフォルトでどのようなファイアウォールになっているのか確認してみます。

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    

内外問わず、ザルです。オールオープンです。
設定を行いましょう。

iptablesの設定

「/etc/iptables/」に設定ファイルがあります。
まずはオリジナルを残しておきましょう。

$ sudo cp rules.v4 rules.v4.orig
$ sudo cp rules.v6 rules.v6.orig

VPSサーバとかでしたら、IPv4 のみか IPv6 も提供されているのかでガチガチ度が違いますが。
ホームユースということで、IPv4 と IPv6 の両方が使えるようにしておきたいと思います。
基本は、中から外は全て通し、外から中は全て通さない、とします。
IPv4 からルールを設定してみましょう。
「/etc/iptables/rules.v4」「/etc/iptables/rules.v6」を編集していきます。

# 中から外は全て許可。逆は不可。
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# ループバックアドレスをもった接続を拒否
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# すでに確立されている接続は許可
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ログは「dmesg」コマンドで見てね
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied IPv4: " --log-level 7
# デフォルトでは全て拒否、ルールにマッチしたもののみ許可
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT

「/etc/iptables/rules.v6」もほとんど同じです。この場合、変更は2箇所です。

-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
 ↓
-A INPUT ! -i lo -d ::1/128 -j REJECT

-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied IPv4: " --log-level 7
 ↓
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied IPv6: " --log-level 7

再起動して、ルールの確認をします。

$ sudo netfilter-persistent reload
$ sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             loopback/8           reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied IPv4: "
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy DROP)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

ウチは IPv4 だから、IPv6 の設定は出てこないな。これでいい。
ルータ(グローバルアドレス)→パソコン(ローカルアドレス)なのでここまでする必要があるのかと思わないでもないですが。
最近のWinとかMacとかスマホとかの事情を見てたら、やったほうがいいんじゃないかと思って。
あとは定期的に ClamAV で「/home」「/usr」「/tmp」あたりをスキャンすればいいんじゃないかと。

いかがでしょうか。
オープンソースでフリーなOSってすごいネ。手間さえかければタダでここまで出来る。
もうM$Winとか戻れないザマス。
次になんかやらかすとしたらFreeBSDでしょうな(笑)
参考になりましたら幸いでございます。

Sponsored Link