SSHサービスは、クラウドサーバーへの主要なアクセスポイントであると同時に、攻撃に最もさらされているサービスの1つです。このガイドは、さまざまなトリックやテクニックのおかげで、サービスのセキュリティを向上させるのに役立ちます。
SSH接続をリッスンするためのデフォルトのポートは22です。この設定を変更すると、サービスがクラウド化され、接続のセキュリティが向上します。
マシン上の他の既存のサービスとの干渉を避けるために、netstatコマンドを使用して現在使用されているポートを確認することをお勧めします。
$ netstat -n -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
udp 0 0 127.0.0.53:53 0.0.0.0:*
netstatに渡される-lパラメータを介して、LISTEN状態にあるすべての接続を強制的に出力します。この例では、次のポートが使用されています。
-
3306MySQLサービス
-
22 SSH
-
80 Apache2 / HTTP
-
53 DNS
ポートを変更するには、/ etc / ssh / sshd_configの構成ファイルを編集し、Portディレクティブのコメントを解除します。
#Port 22
次に、新しい値(場合によっては高い値)を設定して、自動ポートスキャンソフトウェア(2200、5574、1022など)によって傍受されないようにします。
Port 5574
変更を適用するには、次の方法でサービスをアップロードします:
$ sudo service sshd reload
。エラーを修正し、別のSSHクライアントとの新しいアクセスを確認するような方法でリロードを使用して接続を維持します
変更が適用されたら、新しいポートを指定してサーバーに接続します。たとえば、コマンドラインからSSHクライアントを使用している場合:
$ ssh [email protected]<SERVER.IP> -p 5574
セキュリティのために広く使用されているRSAキーによるアクセスは、パスワードベースのログインの代わりになります。このタイプの認証では、クライアントは秘密鍵と関連する公開鍵を生成します。これらの公開鍵はサーバーマシンにインストールされ、クライアントを明確に認証します。 。
公開鍵をインストールするには、クライアントは最初にssh-keygenコマンドを使用して鍵ペアを生成する必要があります。
$ ssh-keygen
Generating public/private rsa key pair.
Enter file where to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
生成を続行する前に、ssh-keygenは認証に使用できるオプションのパスフレーズを要求します。この例では、アクセスを容易にするために、次のファイルは空のままになっています。
終了すると、ソフトウェアは指定された場所に2つのファイルを保存します:
-
id_rsa:クライアントの秘密鍵。誰とも共有しないでください。
-
id_rsa.pub:共有可能な公開鍵。
サーバー環境を準備するには、ログインに使用するユーザーフォルダー内の.sshフォルダーにauthorized_keysという名前のファイルを作成します。
$ sudo mkdir ~/.ssh
$ sudo touch ~/.ssh/authorized_keys
$ sudo chmod 600 ~/.ssh/authorized_keys
次に、クライアントマシンによって事前に準備された公開鍵を貼り付けます。
$ sudo nano ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCoTzd9RnqT0yioQG1klsLEK/VG9myo7CQ47aRXu7hnPit6Lgw5kAjC7vzNWYLTy2oIlsrVI7R/tvWmVNISGkWDp9U3fONbSLp+vgBKDzRUVAIqP/AIJ2THanyZxj2b8XU/4s2uzGoTLSR3ViX0JU6zTc+IkaBp1o3W3OolvO15E10/VYJCKN3TkxPsSSGE3QReXnCcnIZYAnrPf9f1DPP1Lo+VUCIzZ7IzcZajAWQ53hC71mTYNHkUgIlWxpRyEhnsRfmqEfUSFbTwpNEarv7vGlK686C4xVxlVfKbqlNa3/g2Vrae4ArVBM958JPZ6aa+7KDZfH5TDgPPtlFCIGkd [email protected]
ファイルを保存し、SSHサービスをリロードします:
$ sudo service sshd reload
この時点で、パスワードを必要とせずにサーバーにアクセスできるはずです。
$ ssh [email protected]<SERVER.IP>
すべてが正常に機能する場合は、ファイル/ etc / ssh / sshd_configを次のパラメーターで変更して、サーバーマシンからのパスワードアクセスを無効にします。
ChallengeResponseAuthentication no
PasswordAuthentication no
他の公開鍵は、サーバーマシンのファイル〜/ .ssh/authorized_keysファイルの最後に保存するだけで追加できることを忘れないでください。
不要なアクセスとブルートフォース攻撃を減らすための戦略は、SSHサービスの可用性時間を短縮することです。特定の時間(たとえば、午後11時から翌日の午前8時まで)にサーバーに接続する必要がないことが確実な場合は、接続ポートをブロックする自動スケジュールを設定します。
これを行うには、iptablesと呼ばれるデフォルトのファイアウォールを使用しますが、構成を進める前に、iptablesはその性質上、入力された構成を保存しないことに注意してください。
構成の保存と読み込みを高速化するには、iptables-persistentパッケージを使用します。これにより、システムの起動時に保存された構成が再読み込みされます。
次に、パッケージのインストールを続行します:
$ sudo apt-get install iptables-persistent
インストールが完了したら、「チェーン」を入力してSSHサービスをブロックします。
$ sudo iptables -N chain-ssh
$ sudo iptables -A INPUT -p tcp --dport 22 -j chain-ssh
このようにして、ポート22宛てのすべての接続(SSHサービスが別のポートを使用する場合は、この値を変更します)は、新しく作成された「chain-ssh」チェーンを通過します。
現在の構成(iptables-persistentによってロードされます)を次のコマンドで保存します:
$ sudo iptables-save > /etc/iptables/rules.v4
次に、crontabを次のように変更して、チェーンのルールを入力および削除するためのタイムスケジュールを作成します。
$ sudo crontab -e
# m h dom mon dow command
0 23 * * * iptables -A chain-ssh -j DROP
0 8 * * * iptables -F chain-ssh
ご覧のとおり、最初の操作では午後11時の接続のDROPルールが追加され、2番目の操作では午前8時00分にチェーンが空になってサービスが復元されます。