効果的な簡単のWebサーバセキュリティ対策「Linux編」

「効果的な簡単のWebサーバセキュリティ対策」の最終回です。今回の主人公はLinux、つまり、OSのセキュリティ対策です。

今まで、世界中70%のWebサービスはLinuxを使っています。つまり、Linuxはすでに広く使われているということです。 ユーザーが増えるということは、Linuxの脆弱性がより早く発見されるということです。

確かに、ここ5年ほどの間に、Linuxカーネルが深刻なCVEの脆弱性にさらされているのをよく見かけるようになったのも事実です。

でも、これを悪いこととは思わない。 Linux自体がオープンソースなので、発見されたCVEの脆弱性はすぐに修正されます。活き活きとしたエコロジーの体現だと思います。

Linuxサーバを安全に保つためには、私たち自身が良いセキュリティ習慣を維持する必要があります。


# 定期的なシステム更新

Linuxカーネルやパッケージを頻繁にアップデートすることで、最新の脆弱性を回避することができます。

通常は安定性を前提としたLinuxディストロの安定版（Ubuntu LTSとDebian StableとCentOSなど）を使用しており、カーネルは小さなバージョンしか更新しないし、最新カーネルへの直接のアップグレードはありませんので、カーネルのアップデートによる不具合とか、互換性の問題とかの問題は心配するが必要ないです。

システムまたはパッケージの更新:

**Debian/Ubuntu**

      apt-get update && apt-get upgrade -y && apt-get autoremove -y && apt-get clean -y

または:

      apt update && apt upgrade -y && apt autoremove -y && apt clean -y

**CentOS**

      yum update -y && yum upgrade -y


もちろん、様々なLinuxディストリビューションで自動更新を利用することもいい。

# SSHセキュリティ

SSHのセキュリティは、Linuxのセキュリティ対策の中で、間違いなく最も重要なものの一つです。Linuxサーバーのハッキングのほとんどのケースは、SSHパスワードがクラックされていることが原因です。

Linuxサーバのセキュリティを確保するためにまずやるべきことはSSHの確保です。

通常、SSHパスワードがブラストされるのを防くのために、多くの人がSSH保護のためにFail2banを使うと言うでしょう。しかし、違法な侵入者がプロキシIPを多用してSSHに乱暴に侵入していることが判明しました。 そのため、Fail2banは効果的な保護ができなくなってしまいました。

なので、Fail2banを使ってSSHを保護しても特に効果があるわけではないのでお勧めしません。逆に、Fail2banは多くのiptablesルールも占有するため、iptablesのパフォーマンスに影響します。

では、SSHをどのように保護しますか？ 次の方法をお勧めします:

----------------------------------------------

### 1. SSHパスワードを強力なパスワードに設定する

SSH のブルートフォースクラッキングは、基本的には弱い暗号辞書を使って試みられています。そのため、SSHパスワードを強いものに変更する必要がありました。

通常、パスワードを12文字以上に変更し、大文字と小文字、数字に特殊記号を加えたものにしています。 これにより、パスワードが乱暴に解読されることを大きく防ぐことができます。

パスワードを変更する方法：

      passwd root

----------------------------------------------

### 2. SSHのデフォルトポートを変更する

通常、SSHに対する悪意スキャナは22番ポートのみをスキャンします。

そこで、SSHのデフォルトポートを別のポートに変更するだけで、悪意スキャナのこの部分を防ぐことができます。

デフォルトのポート変更方法：

#### 2.1 SSH設定ファイルを開く:

        vim /etc/ssh/sshd_config

#### 2.2 以下のパラメータを変更します:

        Port 22322 #<----好きなポートを選択してください

#### 2.3 iptablesが有効になっている場合は、変更したSSHポートをホワイトリスト化する必要があります:

        iptables -A INPUT -p tcp --dport 22322 -j ACCEPT

#### 2.4 SSHサービスを再起動しましょう:

        /etc/init.d/ssh restart

----------------------------------------------

### 3. SSH証明書を使ってログインします

ログインにSSH証明書を使用すると、SSHパスワードがブルートフォースでクラックされるのを防ぐことができます。だって、パスワードが全くないから。パスワードなしでどうやってクラックしますか？

#### 3.1 SSH証明書を生成する

ここでは、PuTTYの証明書ジェネレータを使用して、公開鍵と秘密鍵を生成し、生成後に保存します。

![933308-20170802175036271-384330402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668967/7a0a148a-f675-2672-dccc-1aa018a67d34.png)


#### 3.2 公開鍵をサーバーにアップロードする

ここでは、公開鍵を「/etc/ssh/key/public.key」にアップロードしたと想定しています。

次に、公開キーを正しいシステム権限に設定します:

    chmod 700 /etc/ssh/key
    chmod 600 /etc/ssh/key/public.key

#### 3.3 ログインにSSH証明書ために、SSH設定ファイル中の以下のパラメータを変更します:

SSH設定ファイルを開く:

        vim /etc/ssh/sshd_config

以下のパラメータを変更します:

        ......
        RSAAuthentication yes
        PubkeyAuthentication yes
        AuthorizedKeysFile /etc/ssh/key/public.key
        PermitEmptyPasswords no
        AllowTcpForwarding no
        X11Forwarding no
        PasswordAuthentication no
        ......

#### 3.4 SSHサービスを再起動しましょう:

        /etc/init.d/ssh restart

----------------------------------------------

### 4. 指定したIPアドレスのみSSHポートへの接続を許可します

これが最も安全なSSHログインです。 SSH証明書ログインよりもさらに安全です。

SSHの証明書は漏洩の危険性がありますが、指定されたIPだけがSSHにログインできる方法は事実上破られることはありません。

ただ、自分で固定のプロキシサーバーを持っていて、プロキシサーバーのセキュリティ対策がしっかりしている場合に限ります。

個人的には、ワイヤーガードを使って自分のネットワークに接続してからインターネットにアクセスするなどしています。だから、私の輸出IPは固定されています。

そのため、私のサーバはすべてSSH接続のために私の出口IPに制限されています。

プロキシサーバーのIPを2つホワイトリストとして設定することをお勧めします。 バックアップとしてのプロキシサーバーの一つ。 また、両方のプロキシサーバーが異なる地域にあることをお勧めします。

ホワイトリストを設定：

        iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        iptables -A OUTPUT -j ACCEPT
        iptables -A INPUT -s xxx.xxx.xxx.xxx -p TCP --dport 22322 -j ACCEPT
        iptables -A INPUT -p tcp --dport 22322 -j DROP

iptables設定を保存する(Debian/Ubuntu):

        /etc/init.d/netfilter-persistent save
        /etc/init.d/netfilter-persistent reload

-----------------------------------------------------------------
        
### 5. 公式サイトからSSHクライアントをダウンロードする

たとえ、PuTTYでは、多くの非公式WebサイトにダウンロードされたPuTTYファイルにはバックドアがあり、ユーザーのSSHパスワードを違法に盗む可能性があります。

[PuTTY公式サイト](https://www.putty.org/)

### 6. ログインできる不要な低権限アカウントを削除または無効化します。（ 7.28更新 ）

最近忙しくて、予定していた次の記事がまだ書けていません。しかし、今日突然思い出した、この非常に重要な対策は、この記事で書くのを忘れていました。

過去2年間で、私は多くのsshブルートフォースクラッキングがROOTアカウントのパスワードをクラックしようとしているのではなく、いくつかの低特権アカウントのパスワードをクラックしようとしていることに気づきました。

これは何の原因ですか？ 

実際には2つの主な理由があります。

先ずは、この数年間、暗号化仮想通貨の人気により、サーバーへの不正侵入後に暗号化仮想通貨をマイニングすることを主な目的とする新たな産業チェーンが出現しています、その目的はROOT権限必要ない。も一つのは、DDoS攻撃のゾンビネットウェルスプログラムは同じいに、ROOT権限必要ない。

次の理由。この数年間、Linuxカーネルで、多くのローカル権限昇格のCVE脆弱性に発見されています。なので、ROOTアカウントのパスワードをクラックして最高の特権を直接手に入れる必要は全くありません。

だから、ログインできる不要な低権限アカウントを削除または無効化するは必要だ。

**このコマンドを使用して、ログインできるのアカウントをすべて表示します：**

    cat /etc/passwd|grep -v nologin|grep -v halt|grep -v sync|grep -v false|grep -v shutdown|awk -F":" '{ print $1"|"$3"|"$4 }'|more

**このコマンドを使用して、不要なアカウントを削除します:**

    userdel -r GuestAccount



# 指定した受信ポートのみを許可する

通常、Webサーバーが使用するポートは固定されています。例えば、HTTPの80ポートとか、HTTPSの443ポートとか。これらのポートへの接続のみを許可することで、未知の攻撃の発生を防ぎます。

ここで特に注意したいのがDNSのポートです。DNSがUDPプロトコルを使用していることは誰もが知っていますが、UDPにはTCPプロトコルのような接続保持機能はありません。ですから、適切なDNS解決を行うために53番ポートを開放します。

ただし、DNS解決以外では、一般的なWebサーバではUDPプロトコルは必要ありません。そこで、DDoS攻撃を防ぐために、私は一般的にすべてのUDPプロトコルをブロックしています。しかし、それはすべてのDDoS攻撃を防御するものではありません。 DDoS攻撃からの防御方法については、後日の記事で説明します。


iptablesを使用してポートを制限する:

    iptables -A INPUT -i lo -j ACCEPT #<-- ローカルループバックインターフェースを許可する (すなわち、ローカルマシンへのローカルアクセスを実行する)
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #<-- 確立された接続または関連する接続の通過を許可する
    iptables -A OUTPUT -j ACCEPT #<-- すべてのローカルアウトバウンドアクセスを許可する
    iptables -A INPUT -s xxx.xxx.xxx.xxx -p TCP --dport 22322 -j ACCEPT #<-- 指定したIPアドレスのみSSHポートへの接続を許可します
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT #<-- HTTP
    iptables -A INPUT -p tcp --dport 443 -j ACCEPT #<-- HTTPS
    iptables -A INPUT -p udp --dport 53 -j ACCEPT #<-- DNS
    iptables -A INPUT -j REJECT #<-- 許可されていない他のルールへのアクセスを禁止する
    iptables -A FORWARD -j REJECT #<-- 許可されていない他のルールへのアクセスを禁止する

-------------------------------------------------------

# 結論

ここまで、「効果的な簡単のWebサーバセキュリティ対策」シリーズのチュートリアルは終了しています。

基本的には、私をご紹介したセキュリティ対策に従うことで、Webサーバーを安全に保つことができます。

ただし、100%のサーバーセキュリティを確保するためには、個人のサーバーセキュリティに対する意識を高めることも必要です。将来のセキュリティの脅威に直面するためには、常に準備をしておかなければなりません。

以上です。