OXY NOTES

ブルートフォースアタック対策!サーバへの接続に鍵認証を利用する方法

これだけ設定すれば総当たり攻撃対策は万全

リモートからコマンドを実行するTera Term。ファイルを転送するWinSCP。この2つのソフトでログイン時に鍵認証を利用する方法を解説します。

合わせてSSH通信に利用するポート22番を変更する方法も解説します。


Tera Termで鍵認証を利用する方法

まずはTera Term用の「公開鍵」と「秘密鍵」を作成します。作成した「公開鍵」をサーバにアップロード。サーバ側、クライアント側の設定を変更。という流れで設定します。

1.Tera Termを起動して「設定 > SSH鍵生成」をクリック。

2.RSA形式の鍵を生成

鍵生成ウィンドウで「RSA」を選択した状態で、鍵長に「2048bit」を指定して「生成」ボタンをクリック。

3.秘密鍵と公開鍵の生成

鍵を生成しました」と表示されたら「鍵のパスフレーズ」と「パスフレーズの確認」に鍵用のパスワードを入力(Linuxログイン時に入力するユーザーパスワードではなく、鍵認証に利用する独自のパスフレーズです)。
そして「公開鍵の保存」をクリック。保存場所はどこでもいいですが、今回は「C:\Program Files\teraterm」に「id_rsa.pub」という名前で保存しました。
同じように「秘密鍵を保存」ボタンをクリックして、「id_rsa」という名前で保存してください。

鍵認証に利用するパスフレーズについて

鍵認証でログインするには今回生成した秘密鍵が必要です。そのため接続するクライアント側の安全が確保されているなら秘密鍵のパスフレーズは入力しなくても構いません。

そうすればログイン時にパスフレーズを入力する手間が省けます。秘密鍵作成時に「空のパスフレーズを使用しますか?」と表示されるので、「はい」をクリックしてください。

別の利用者と共通で利用する場合や、ノートパソコンなど持ち出す可能性がある場合はパスフレーズを入力するようにしてください。

これで「id_rsa.pub(公開鍵)」と「id_rsa(秘密鍵)」が生成されたので、鍵生成ウィンドウを閉じてください。


サーバ側の設定を変更

1.公開鍵のアップロード

先ほど作成した公開鍵「id_rsa.pub」を「鍵認証でログインするユーザーのhomeディレクトリ」にアップロードします。hogeユーザーであれば「/home/hoge」。

アップロードはWinSCPを利用するか、Tera Termでログイン後に「Tera Termのウィンドウ」にファイルをドラッグして「SCP」ボタンをクリックしてもアップロードできます。

アップロード機能ですが「Tera Termでログインしたユーザーのhomeディレクトリ」に保存されます。そのため、アップロードする場合は鍵認証でログインしたいユーザーでログインして作業するか、rootユーザーに変更してファイルを移動するなどしてください。

2.公開鍵を所定のファイルに登録

SSHでログインする際に確認する公開鍵の内容を「authorized_keys」にコピーします。
Tera Termで以下のコマンドを打ってください。

$ mkdir .ssh ←「.SSH」ディレクトリの作成
$ chmod 700 .ssh ←パーミッションの変更
$ cat id_rsa.pub > .ssh/authorized_keys ←「id_rsa.pub」の内容を「.ssh」ディレクトリの「authorized_keys」に登録
$ chmod 600 .ssh/authorized_keys ←「authorized_keys」のパーミッションを変更
$ rm id_rsa.pub ←公開鍵の削除

3.sshd_configの編集

SSHの設定ファイル「/etc/ssh/sshd_config」を編集します。

$ su - ←rootユーザーでログイン
# cd /etc/ssh ←ディレクトリを移動
# cp sshd_config sshd_config.org ←設定ファイルのオリジナルをバックアップ
# vi /etc/ssh/sshd_config ←viで編集

44行目あたり「RSAAuthentication」と「PubkeyAuthentication」のコメントアウトを解除。さらに「AuthorizedKeysFile .ssh/authorized_key」を追加。

#RSAAuthentication yes
#PubkeyAuthentication yes

#RSA認証を許可(ssh1のみ)
RSAAuthentication yes

#公開鍵認証を許可(ssh2のみ)
PubkeyAuthentication yes

#認証に利用するファイルのパスを指定
AuthorizedKeysFile .ssh/authorized_keys

60行目あたり「PasswordAuthentication」のコメントアウトをはずして「no」に変更。

#PasswordAuthentication yes
PasswordAuthentication no
この設定を「no」にすると、通常のユーザーIDとパスワードを利用したログインができなくなります。
正しく設定できたか不安な方は、まずこの設定は変更せずに鍵認証でログインできることを確認してから変更してください。

編集が終わったら「:wq」で保存してviを終了します。

4.設定ファイルの読み込んで有効にする

# /etc/rc.d/init.d/sshd reload ←もしくはrestart
sshd を再読み込み中:                                       [  OK  ]

OK」と出れば鍵認証が有効になっています。


実際にTera Termで鍵認証を利用してログイン

1.Tera Termを起動してSSH2を選択して「OK」ボタンをクリック

2.秘密鍵を選択してログイン

ユーザー名とパスワード(鍵を作成した時に入力したパスフレーズ。入力していない場合は空欄で結構です。)を入力して、「RSA/DSA鍵を使う」にチェックを入れて、「秘密鍵」ボタンをクリック。上で作成した「id_rsa」を選択して「OK」ボタンをクリック。

正しく設定できていれば、ログインできるはずです。

PasswordAuthentication」を「no」に設定した場合は、通常のユーザーIDとパスワードを利用したログインができなくなっていることを確認してください。

これで秘密鍵を持ったクライアントでないとログインできなくなりました。どれだけパスワードの総当り攻撃を受けても破られることはまずありません。


Tera Termログイン時のデフォルトの設定

毎回「秘密鍵」を選択するのは面倒なので、鍵認証でログインした状態で「設定 > SSH認証」をクリックします。
認証設定ウィンドウで「ユーザー名」を入力して、「RSA/DSA鍵を使う」にチェックを入れて「秘密鍵」を選択。
ログイン前にサーバで有効な認証方法を確認する」にチェックを入れて「OK」ボタンをクリック。

続いて「設定 > 設定の保存」をクリックしてTera Termフォルダにある「TERATERM.INI」を上書きしてください。

これで秘密鍵を毎回指定しなくても済みます。


WinSCPでも鍵認証を利用してログイン

WinSCPではPuTTY形式の鍵を利用して認証を行います。通常WinSCPフォルダに同梱されている「PuTTYgen」を利用して鍵を作成します。
今回はTera Termで作成した「秘密鍵」を「PuTTYgen」でPuTTY形式に変換して利用します。

1.PuTTYgenの起動

C:\Program Files\WinSCP\PuTTY」フォルダにある「puttygen.exe」を実行して「Load」ボタンをクリックします。

2.秘密鍵の選択

C:\Program Files\teraterm」に保存したTera Term用の秘密鍵「id_rsa」を選択します。(ファイル形式でAll Filesを選ぶと表示されます)
すると鍵の取り込みに関するダイアログが出るので、「OK」ボタンをクリック。

3.鍵をPuTTY形式に変換

Parameters」で「SSH-2 RSA」を選択して、鍵長に「2048」を入力。「Save Private key」をクリックして、PuTTY形式の秘密鍵を生成します。
分かりやすいように「C:\Program Files\WinSCP」フォルダに、「id_rsa_winscp.ppk」という名前で保存しました。(.ppkはPuTTY形式の秘密鍵の拡張子)

4.WinSCPで鍵認証を利用してログイン

WinSCPを起動して「ユーザー名」と「パスワード(鍵用のパスフレーズを入力した場合。入力していない場合は空欄)」を入力して、「秘密鍵」でWinSCP用の秘密鍵(C:\Program Files\WinSCP\id_rsa_winscp.ppk)を選択、「ログイン」ボタンをクリック。

WinSCPのログイン画面で「保存」ボタンをクリックすれば、次から鍵を選択する手間を省けます。

補足:Tera Termの秘密鍵を利用しない方法

今回はTera Termの秘密鍵を利用しましたが、「PuTTYgen」で1から作成した公開鍵と秘密鍵のセットでログインする方法も解説します。

1.「PuTTYgen」で鍵の作成

PuTTYgen」を起動して「Parameters」で「SSH-2 RSA」を選択して、鍵長に「2048」を入力。
Generate」ボタンをクリック。赤く囲った範囲でマウスを動かし、ランダムな鍵を作成します。

2.公開鍵、秘密鍵の作成

Save public key(公開鍵)」と「Save privete key(秘密鍵)」ボタンをそれぞれクリックして作成して鍵を生成します。(パスワードを入力しないとダイアログが出ますが「はい」をクリックして閉じます)
わかりやすくするためにファイル名を「id_rsa_winscp.pub(公開鍵)」と「id_rsa_winscp.ppk(秘密鍵)」としました。

3.Tera Termの時と同じように公開鍵を「authorized_keys」に登録

Tera Termで「id_rsa.pub」の内容を「.ssh」ディレクトリの「authorized_keys」に登録したのと同じように、今回作成した公開鍵「id_rsa_winscp.pub」をアップロードして登録。

既に「authorized_keys」が作成済みでも「cat id_rsa_winscp.pub >> .ssh/id_rsa_winscp.pub」とすれば複数の鍵を追加することができます。そうすることで両方の鍵でログインすることができるようになります。

続いて「sshd_config」を上の設定と同じように編集すれば同じようにログインできるはずです。


SSH用のポートを変更

上記の鍵認証をを導入すれば、パスワードを総当りするブルートフォースアタックで不正ログインされることはありません。
しかし、SSHで利用するポート22番は外部からの攻撃を受け続けています。そこでSSH通信で利用するポートを変更して、ポート22番はファイアウォールで遮断します。

どれだけ攻撃を受けているか確認するには以下のコマンドでログを見てください。見に覚えのないIPから大量のアクセスを受けているのを確認できると思います。サーバを公開後数十分で攻撃されることも珍しくありません。

# su -
# cat /var/log/secure

etc/ssh/sshd_config」でSSHで利用するポート番号を変更します。

# vi /etc/ssh/sshd_config

13行目あたりにある「Port 22」のコメントアウトを外して好きなポート番号に変更します。(今回は例として42424にしました)

#Port 22
Port 42424
指定するポート番号について

変更するポート番号は、あらかじめ予約されている「ウェルノウンポート(0~1024番)」以降を設定することが推奨されています。
Linuxでは自由に設定できるポート番号を「/proc/sys/net/ipv4/ip_local_port_range」に記載しています。デフォルトでは「32768番~61000番」となっているので、この範囲の番号を指定すると他のソフトと競合することはないため、お勧めです。

変更が終わったら、設定ファイルの読み込んで有効にする

# /etc/rc.d/init.d/sshd reload

続いてファイアウォールで、22番を遮断して指定したポートを開放します。
ACCEPT」が許可、「REJECT」が遮断です。「–dport 22」となっている行を探して以下のように変更

# -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# SSH
-A INPUT -p tcp -m tcp --dport 22 -j REJECT

その行の後に新しく許可するポートを追加。(42424)を自分が設定したポートに変更してください。

# NewSSH
-A INPUT -p tcp -m tcp --dport 42424 -j ACCEPT

編集が終わったらファイアウォールを再起動します。(設定が有効になるとポート22番を利用した現在の通信は切断されます。)

# /etc/init.d/iptables restart

これでSSHで利用するポート番号が変更できました。
Tera Term等で新しいポート番号でログインしてみてください。初回接続時はキャッシュに保存された情報と違いますというダイアログがでますが、そのまま接続してください。

公開鍵を登録した時と同じように「設定 > 設定の保存」を実行すれば、新しく設定したポート番号を入力する手間を省けます。

最後にポート22番ではログインできないことを確認してください。
以上の設定をしておけば、外部から不正アクセスを受ける危険性はほとんどありません。(まったく別の脆弱性を突かれた場合は除く)