簡単に不正アクセスされないようにセキュリティに配慮したSSHサーバの構築方法を、初心者にもわかりやすく説明します。なお、almalinuxなどのCentOS後継のOSでも設定は同じです。
SSHで安心安全に遠隔操作する必要性とは
CentOSなどのLinuxサーバをインストールした後は、デフォルトでSSHが有効になっていることが多いです。それゆえに特に設定することなく、そのまま使用していたりしませんでしょうか。
SSHはサーバを遠隔操作できる非常に便利なものの反面、対策やサーバの設定が甘いと外部から不正アクセスを受けてしまいます。実際、グローバルIPアドレスでSSHのポートを開放すると、ものの1分もたたないうちに海外のIPアドレスからアクセスがありログインを試されました。一度アクセスできるとわかると、いろいろな国からどんどんアクセスが来ました。怖いですね。しっかり対策を行って安心安全に使用できるようおすすめの設定を紹介します。
いまやtelnetに代わって、SSHでの不正アクセスが増えているそうですね…
そうなんです。だから基本的な設定をしっかり実施して、対策する必要があります。
まずは接続するCentOSサーバの仕様を簡単に決める
まずはどのような仕様のサーバを作成するか、最初に決めてから進めます。目的をはっきりさせるためです。今回構築するSSHサーバの要件として、私は以下のように定義しました。
- SSHのみを使用する。認証は、証明書認証を使用し、パスワード認証の使用はなし。
- アクセスするユーザは個別に(一般ユーザで)作成し共用しない。rootのログイン不可。
- ログイン時に、ログインしたユーザ宛てにメール送付する。
- FWで日本のIPアドレスからのみアクセス可能に制限する。
- logwatchで定期的にサーバのログイン状況確認する。
これ以外にも二要素認証も設定できたりしますが、初心者の方でも簡単に設定ができる、かつ、SSHでログインする際に面倒ではない、ほどよい対策が必要だと考え、このような構成にしています。
SSHの設定ファイルは /etc/sshd/sshd_config の編集でOK
それでは、SSHサーバの設定を実施していきます。使用で決定した通り、ここでは、証明書認証を実施し、パスワード認証は使用しない設定を行います。同時にrootのログインは出来ないように設定します。具体的には、設定ファイルに以下のパラメータを記入します。
PubkeyAuthentication yes ← 証明書認証を実施
PasswordAuthentication no ← パスワード認証は実施しない
PermitRootLogin no ← rootのログインは出来ない
設定後、内容を反映させるために、sshdのサービスを再起動します。
# systemctl restart sshd
たったこれだけの設定で、セキュリティはグッと高まりました。なぜなら、証明書認証はキーファイルがないと成功しませんし、パスワードは設定しないので漏れません。またrootでアクセスされなければ、サーバを管理者権限で乗っ取られる可能性も下がるからです。これはおススメですので是非実施ください。
ここで、本題とは離れるのですが、もし「証明書」と「パスワード」の2要素認証をsshで実施したい場合は、
PasswordAuthentication yes
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,password publickey,keyboard-interactive
とすることで、利用可能になります。
しかし、Teratermを使用している場合は、2要素認証ログインに対応していないので、別のクライアント(putty)を使用するか、次の内容を記載したbatファイルを作成します。
"C:\Program Files (x86)\teraterm\ttermpro.exe" <接続先サーバのIPアドレス>:<SSHのポート番号> /ssh2 /auth=publickey /ask4passwd /keyfile="<秘密鍵ファイルのパス>"
作成したbatファイルを実行して、ユーザ名と証明書のパスフレーズを入力し、まず鍵認証での接続を行います。「認証に失敗しました。再試行してください」と表示されますが、ここで認証方式を「キーボードインタラクティブ認証を使う」に設定し、接続するとパスワードを求められるので、パスワードを入力するとログインできます。
実際に試してみると、少し面倒ですね。セキュリティが高まる一方で、初回アクセス時のみですが、ちょっと手間のような気がしますので、私は採用しませんでした。安心安全を高めたい方は是非お試しください。
証明書認証でログインするための秘密鍵と公開鍵を作成する
証明書認証でSSHでログインするには、まず証明書の秘密鍵と公開鍵を作成する必要があります。なんだか難しそうな感じがしますが、簡単ですので安心してください。
私はターミナルソフト teraterm を使用して作成しました。ここで紹介するか迷いましたが、詳しく解説されている方が多いので今回はそちらに譲ることにします。ググるとたくさん出てきますので、検索してみてください。なお鍵の種類は、ED25519 が推奨のようですので、迷ったらこちらを選択しましょう。
証明書の公開鍵(.pub)をSSHサーバのログインするユーザのホームディレクトリに配置します。具体的には、/home/ユーザ名/.ssh/authorized_keys ファイルに作成した公開鍵の内容を漏れなく追記します。
最後にパーミッションの設定を行います。パーミッションが適切でない場合は、遠隔からログインができませんので、忘れずに実施ください。私もコレが対応出来ておらず、アクセスできませんでした。
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys
ここまで準備ができましたら、Teratermなどで、証明書認証を指定してログインできるかを確認しましょう。
SSHログイン時に自動でコマンド(シェル)を実行する方法
ここでは、「ログイン時に、ログインしたユーザ宛てにメール送付する」と決めた仕様になるように設定します。シェルがわかる方はいろいろアレンジ出来ると思います。実施したい運用に合わせて、チャレンジしてみてください。
まず、/etc/ssh/sshrc
ファイルを作成します。こちらのファイルはSSHでログインした際に自動的に実行されるファイルになります。私は具体的に以下のようにファイルを作成しました。
#!/bin/sh
case "${USER}" in
"testuser001" ) MAIL_TO=testuser001@dassyi.com ;;
"testuser002" ) MAIL_TO=testuser002@dassyi.com ;;
* ) MAIL_TO=admin@dassyi.com ;;
esac
TIME=`/bin/date "+%Y/%m/%d %H:%M:%S"`
FROM_ADDR=`echo $SSH_CONNECTION | cut -d' ' -f1`
FROM_ADDR_PORT=${FROM_ADDR}
echo -e "Time\t${TIME}\nHost\t${HOSTNAME}\nUser\t${USER}\nFrom\t${FROM_ADDR_PORT}\n" | /bin/mail -s "[SSH]${HOSTNAME}/${USER} (${TIME})" -r admin@dassyi.com ${MAIL_TO}
例えば、testuser001でログインすると、testuser001@dassyi.com宛てにメールが通知される形になっています。自分がログインしたら、メール通知があるので、もし何もしていないときにメール通知があるとすぐに不正アクセスである事に気が付けます。これもあって、仕様で「ユーザは個別に(一般ユーザで)作成し、共用しない」としています。ちょっとしたことですがセキュリティを高めるのに重要な事ですので、ぜひこの方法を採用してください。
セキュリティ対策が施されたSSHサーバのまとめ
CentOSで構築する安心安全のSSHサーバの構築はいかがでしたでしょうか。思ったより簡単に対応できると思いませんか?たったこれだけの事でセキュリティが高めることができるので、絶対に設定してください。
なお、最初に定義した仕様の残りの「FWで日本のIPアドレスからのみアクセス可能に制限する」と「logwatchで定期的にサーバのログイン状況確認する」については、別ページにて紹介しております。(firewallの基本的な設定については「どうすればよい?CentOSのFirewallを無効・停止せず設定する方法」の記事に記載しています)
SSHのコンフィグによる設定だけでなく、ファイアウォールやメール通知などの機能を用いて、総合的にセキュリティ対策する必要があります。こちらも忘れずに実施ください。
今回はここまでです。最後までお読みいただきありがとうございました。