セキュリティを強化する設定

概要



不要なサービスを停止

  1. サポートするのは、ssh, http, pop3, pop3s, smtp, smtps, sftp, webmin だけなので、これ以外のサービスを停止します。

    手順 内容 備考
    1 webmin の [ネットワーク]-[Network Services] をクリックすると Xinetd 起動するサービスが表示されます。 全て無効になるように設定します。 ポート起動するサービスはないので、全て停止でよいです。 既に全部停止状態になっていました。
    2 webmin の [システム]-[起動およびシャットダウン] をクリックするとデーモンが表示されているので、不要なデーモンを無効化します。 不要なデーモンを停止します。



一般ユーザの su コマンド禁止 / root の ssh ログイン禁止

  1. su コマンドは root に移行できる超強力コマンドです。 ところが、Linux では全てのユーザが su コマンドで root になれるのがデフォールトです。

  2. root で直接ログインは止めたほうがよいです。

    手順 内容 備考
    1 webmin で、唯一 root になれるユーザアカウント sys-kun を作成します。 sys-kun にはシェルを与えます。 sys-kun は仮名です。 本名は内緒 です。
    2 webmin で wheel グループを作成し、メンバに sys-kun を(1つだけ)記述します。  
    3 /etc/pam.d/su を編集し、以下の赤字の部分を変更します。
    # Uncomment this to force users to be a member of group root
    # before they can use `su'. You can also add "group=foo"
    # to the end of this line if you want to use a group other
    # than the default "root" (but this may have side effect of
    # denying "root" user, unless she's a member of "foo" or explicitly
    # permitted earlier by e.g. "sufficient pam_rootok.so").
    # (Replaces the `SU_WHEEL_ONLY' option from login.defs)
    auth       required   pam_wheel.so group=wheel
    
    wheel グループに登録した sys-kun だけが su コマンドを使用できます。
    4 /etc/ssh/sshd_config を編集し、以下の赤字の部分を変更します。
    PermitRootLogin no
    
    root の ssh ログインが禁止となります。



webmin に対するセキュリティ確保

  1. webmin を攻撃者に乗っ取られると大変なことになります。

  2. 対策は ・・・

    手順 内容 備考
    1 webmin で、[Webmin]-[Webmin ユーザ]-[新しい Webmin ユーザを作成] と辿り wbm-kun を作成します。 [使用可能な Webmin モジュール] は全てとします。 wbm-kun は仮名です。 本名は内緒 です。
    2 一旦、Sign out して手順1で作成した wbm-kun でログインし、全ての操作ができることを確認します。  
    3 webmin で、[Webmin]-[Webmin ユーザ] と辿り root ユーザを削除します。 これで wbm-kun しか webmin にログインできなくなります。 結果的に [Username] [Password] を変えてしまったことになります。
    4 webmin で、[Webmin]-[Webmin 設定]-[ポートとアドレス] と辿り、新しいポート番号を設定します。 設定した ポート番号は秘密 です。 ポート番号には 1024〜65535 が使用できますが、49152〜65535 辺りが良いです。
    5 webmin で、[システム]-[起動およびシャットダウン] と辿り、[webmin] を選択してから [選択したものをブート時に停止する] をクリックします。 これで、システム起動時に webmin 起動しないようになります。 webmin の起動や停止は以下のコマンドでできます。
    # service webmin start
    # service webmin stop
    # service webmin restart
    



ssh に対するアタック軽減とセキュリティ強化

  1. ssh の標準ポート番号 22 には、毎日毎日、ものすごい数のアタックパケットが飛んできます。

    手順 内容 備考
    1 webmin で、[サーバ]-[SSH サーバ]-[ネットワーク] と辿り [待受け(Listen)ポート] を変更します。 変更後の ポート番号は内緒 です。
    2 /etc/ssh/sshd_config を編集して、最後に次の記述を追加します。
    MaxStartups	2:70:5
    
    2つまでの接続要求を受け付け、これを超えると 70% の確率で接続要求を拒否し、5つを超えると全て拒否します。 数値を厳しくし過ぎると、アタックされている間、正規管理者もログインできなくなるので程々です。

  2. OpenSSH は機能が豊富過ぎて、かえって困る場合があるのです。

    手順 内容 備考
    1 /etc/ssh/sshd_config を編集して、最後に次の記述を追加します。
    AllowUsers	sys-kun www-kun
    
    これで sys-kun と www-kun しか ssh にログインできなくなります。 究極のセキュリティ強化です。



ファイアウォール iptables の設定

  1. iptables ファイアウォールを abuna.net (nice.kaze.com) サーバとインターネットの間に置いて、サーバを守ります。

  2. Debian8 ではデフォールトで iptables がインストールされています。

    手順 内容 備考
    1 iptables に設定するルールを保存する /etc/iptables_rules_org ディレクトリを作成します。
    # makdir /etc/iptables_rules_org
    
    オリジナルルールを保存するフォルダです。
    2 以下の内容の IPv4 のルール /etc/iptables_rules_org/rules.v4 を作成します。
    # (1) ポリシーの設定 OUTPUTのみACCEPTにする
    
    *filter
    :INPUT   DROP   [0:0]
    :FORWARD DROP   [0:0]
    :OUTPUT  ACCEPT [0:0]
    
    # (2) ループバック(自分自身からの通信)を許可する
    
    -A INPUT -i lo -j ACCEPT
    
    # (3) データを持たないパケットの接続を破棄する
    
    -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
    
    # (4) SYNflood攻撃と思われる接続を破棄する
    
    -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
    
    # (5) ステルススキャンと思われる接続を破棄する
    
    -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
    
    # (6) icmp(ping)の設定
    # hashlimitを使う
    # -m hashlimit				hashlimit モジュールを使用する
    # -hashlimit-name t_icmp		記録するファイル名
    # -hashlimit 1/m			リミット時には1分間に1パケットを上限とする
    # -hashlimit-burst 10			規定時間内に10パケット受信すればリミットを有効にする
    # -hashlimit-mode srcip			ソース IP を元にアクセスを制限する
    # -hashlimit-htable-expire 120000	リミットの有効期間。単位は ms
    
    -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name t_icmp --hashlimit 1/m
     --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT
    
    # (7) 確立済みの通信は、ポート番号に関係なく許可する
    
    -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A INPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
    
    # (8) 任意への DNS アクセスの戻りパケットを受け付ける
    
    -A INPUT -p udp --sport 53 -j ACCEPT
    
    # (9) SSHを許可する設定
    # hashlimitを使う
    # -m hashlimit				hashlimit モジュールを使用する
    # -hashlimit-name t_sshd		記録するファイル名
    # -hashlimit 1/m			リミット時には1分間に1パケットを上限とする
    # -hashlimit-burst 10			規定時間内に10パケット受信すればリミットを有効にする
    # -hashlimit-mode srcip			ソース IP を元にアクセスを制限する
    # -hashlimit-htable-expire 120000	リミットの有効期間。単位は ms
    
    -A INPUT -p tcp -m state --syn --state NEW --dport xxxx -m hashlimit
     --hashlimit-name t_sshd --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip
     --hashlimit-htable-expire 120000 -j ACCEPT
    
    # (10) 個別に許可するプロトコルとポートをここに書き込む。
    
    -A INPUT -p tcp --dport 25   -j ACCEPT
    -A INPUT -p tcp --dport 80   -j ACCEPT
    -A INPUT -p tcp --dport 443  -j ACCEPT
    -A INPUT -p tcp --dport 465  -j ACCEPT
    -A INPUT -p tcp --dport 995  -j ACCEPT
    -A INPUT -p tcp --dport 2222 -j ACCEPT
    -A INPUT -p tcp --dport yyyy -j ACCEPT
    
    COMMIT
    
    (6) ping の応答を許可しますが、同一 IP アドレスから繰り返しやってくる ping リクエストについては、外部からの攻撃とみなし拒否します。 hashlimit オプションを使うことで、120秒の間に10回パケットを受信すれば、それ以降のリクエストには応答しません。 設定は長いので2行になっていますが、正しくは改行せずに1行にします。

    (7) 確立済みの接続については通信を許可します。 この設定は必須で、しないと abuna.net (nice.kaze.com) 側からネットアクセスできなくなります。 udp もこの設定をしておかないと ntpdate コマンドなどが動作しません。

    (8) abuna.net (nice.kaze.com) 側からの DNS 問い合わせに対しての戻りパケット (UDP ポート53) を許可します。 こうしておくと、SSH 接続などで無駄に待たされることが無くなります。

    (9) SSH を許可しますが、接続回数による制限をかけています。 hashlimit オプションを使うことで、2分間の間に同一 IP アドレスから10回接続要求があると不正な接続とみなし、それ以降の新しい接続要求を2分間拒否します。 xxxx には SSH のポート番号を入れます。 設定は長いので3行になっていますが、正しくは改行せずに1行にします。

    (10) 関係するポートは以下の通りです。
      25 : SMTP
      80 : HTTP
     110 : POP3
     443 : HTTPs
     465 : SMTPs
     587 : Submission
     995 : POP3s
    2222 : SFTP
    yyyy : Webmin
    
    [POP3] [Submission] のポートは開けません。 メールシステムとしてはこのポートもサポートしていますが、ここで止めます。 [SMTP] は外部からのメール受口でもあるため、ポート開放するしかないです。
    yyyy には Webmin のポート番号を入れます。
    3 以下の内容の IPv6 のルール /etc/iptables_rules_org/rules.v6 を作成します。
    *filter
    :INPUT   DROP [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT  DROP [0:0]
    COMMIT
    
    IPv6 での接続は全て拒否します。
    4 作成したルールを iptables に「現在のルール」として記憶させます。
    # iptables-restore < /etc/iptables_rules_org/rules.v4
    # ip6tables-restore < /etc/iptables_rules_org/rules.v6
    
    ちょっと回りくどい設定方法ですが、我慢してください。 こうしないと、正しい Master iptables ができないのです。

    でき上がった Master iptables に ACCEPT [3:164] のような記述がありますが、数字はルールに合致した [パケット数:バイト数] で、統計情報です。 設定とは関係ありません。

    また、*nat や *mangle の項目もあります。 今回は NAT や QoS などの設定は行わないので、これらの項目は全て ACCEPT でよいです。 触る必要ありません。
    5 念のため、以下のコマンドでルールが正しく適用されていることを確認します。
    # iptables -L
    # ip6tables -L
    
    6 iptables の「現在のルール」を Master iptables に保存します。
    # iptables-save > /etc/iptables.up.rules
    # ip6tables-save > /etc/ip6tables.up.rules
    
    7 Webmin で、[ネットワーク]-[Linux ファイヤウォール] と辿り、[設定を適用する] ボタンを押し、[起動時に有効] 項目にある [はい] を選んで、[起動時に有効] ボタンを押すと、IPv4 適用完了です。 これ以降、Webmin でも管理できます。
    8 Webmin で、[ネットワーク]-[Linux IPv6 Firewall] と辿り、[設定を適用する] ボタンを押し、[起動時に有効] 項目にある [はい] を選んで、[起動時に有効] ボタンを押すと、IPv6 適用完了です。