[サーバ初期設定メモ]SSHを公開鍵認証にする

Hack

パスワード認証は極めて危険である

実際に見ていただいたほうがわかりやすいと思う。一日の閲覧数が30程度の当サイトでも攻撃を仕掛けてくる相手は山ほどいる。

Apr 26 12:26:18 tkg sshd[15918]: Failed password for root from 121.18.238.115 port 55115 ssh2
Apr 26 12:26:19 tkg sshd[15918]: pam_winbind(sshd:auth): getting password (0x00000388)
Apr 26 12:26:19 tkg sshd[15918]: pam_winbind(sshd:auth): pam_get_item returned a password
Apr 26 12:26:20 tkg sshd[15918]: Failed password for root from 121.18.238.115 port 55115 ssh2
Apr 26 12:26:20 tkg sshd[15918]: pam_winbind(sshd:auth): getting password (0x00000388)
Apr 26 12:26:20 tkg sshd[15918]: pam_winbind(sshd:auth): pam_get_item returned a password

こんな攻撃がひっきりなしに来るのだから、もっと大規模なサイトだと更に多いことになる。実際、前回運営していたときにはあまりにも攻撃回数が多すぎてログファイルのサイズが主記憶装置を圧迫してSSHでログインできなくなるという自体が発生した。

というわけで公開鍵認証を実装したいと思う。

秘密鍵と公開鍵を作成する

ここの操作はローカルマシンで行うこと。何故なら、仮にリモートマシン(サーバ)で公開鍵を作成した場合、その鍵を安全にローカルに転送する手段がないからである。※SCPを使えばできてしまうのだが、そのためにはパスワード認証を使用しなければいけない。

というわけで、別にリモートマシンでもいいのだが、念には念を入れておこうということである。

大体、リモートマシンに公開鍵を保存しておくというのがそもそも望ましくない(はず)

ssh-keygen -t ecdsa

公開鍵にはDSA, RSA, ECDSAが使用できるが、個人的にはECDSAを推奨します。というのはECDSAはRSAに比べて半分の鍵の長さで同程度の強度があるという結果があるため。どうせなら強いほうがいいじゃないかということ。

このときid_ecdsaとid_ecdsa.pubの2つが生成される。このうちid_ecdsaは絶対に流出させないこと。これは秘密鍵なので、これがバレてしまうと問答無用でサーバにログインされてしまう。

「公開鍵を送って」っていうとたまに間違って秘密鍵の方を送ってくる人がいるのでここは注意されたい。

公開鍵を登録する

ここからはリモートサーバの話。どうにかこうにかしてリモートサーバにアクセスします。

おそらく初回はパスワード認証になるはず。まあこれは仕方ない。

mkdir .ssh
cd .ssh
vi authorized_keys

として、作成したauthorized_keysにid_ecdsa.pubの内容を書き込みます。teratermとか使っていると割と簡単に書き込めるのでこの方法をオススメします。

保存してsshdを再起動すると公開鍵認証が可能になります。

パスワード認証を無効化する

現在の状態だと公開鍵認証もパスワード認証もできる状態になっているので、危険なパスワード認証をオフにします。

sudoedit /etc/ssh/sshd_config

PasswordAuthentication no
ChallengeResponseAuthentication no

sshdを再起動するのだが、ログアウトはしないこと。

何故なら設定やauthorized_keysの記述が誤っていた場合リモートからログインできなくなるため。

sudo service sshd restart

パスワード認証を試してみてログインできないことを確認し、公開鍵認証でログインできることを確認できれば成功。

よく使うSSHサーバを登録する

SSHサーバを踏み台にして別のSSHサーバに接続したいという場合が存在する。

例えば、ぼくの環境では計算用サーバからランバト集計のラズパイにアクセスしたいという場合である。このときに、以下のファイルを.ssh内に保存しておけば一発でアクセス可能になる。

cd ~/.ssh
vi config

記述する内容は以下の通り。ポート設定はデフォルトだと22なのでここはこのままで良いはず。

Host [接続名]
HostName [ドメイン名]
User [ユーザ名]
Port 22
IdentityFile ~/.ssh/id_ecdsa

このように記述したら保存する。接続する場合は、

ssh [接続名]

とすればよい。

連続アクセスを禁止する

パスワード認証は拒否したが、このままでもやはりアクセスしてくる人間は一定する存在する。

そのため、そもそもアクセスを繰り返した人間にはアクセスを禁止するという措置をとる。

これにはいろいろ設定方法があるが、最も楽なのがsshguardを使う方法である。

使用法は簡単で、ただインストールするだけ。

sudo apt install sshguard

デフォルトだと4回アクセスに失敗すると20分間アクセスが拒否されるとかそんなんです。

そのままでも十分な強度なのでなんならデフォルトで運用してしまって問題ありません。

/etc/default/sshguardに設定ファイルがあるのでそこを設定すれば自分好みの強度にできます。

コメント

タイトルとURLをコピーしました