Webサーバーに公開鍵認証を導入する
Category
Server
WebサーバーにSSH接続する際、WindowsならPuTTYやTera Term、MacならTerminalといったターミナルエミュレータを使って接続する場合が多いと思います。
その際、どれくらいセキュリティ対策をしていますか?
「ポートをデフォルトの22番から変更する」「rootでのログインを禁止する(必要な時だけ一般ユーザーからスイッチしてrootへ)」「sudoを使う(ユーザーが別のユーザーの特権レベルでプログラムを実行するためのコマンド)」等いろいろあります。
今回は、公開鍵認証の導入について書こうと思います。
Keyword:公開鍵,秘密鍵,Linuxコマンド,SSH,sshd_config
公開鍵認証を導入することで、Webサーバーには公開鍵(authorized_keys)、SSH接続時にローカル環境上に秘密鍵(id_rsa)がないとアクセスできなくなりますので、接続時のセキュリティが向上し、パスワードの総当たり等の強引な手法でシステムに侵入を試みるクラッカーの攻撃等を防止することができます。
以下の内容で設定していきます。
- 公開鍵認証でアクセスするユーザーを作成
- 公開鍵と秘密鍵の作成
- sshd_configの設定
- ターミナルエミュレータの設定(Tera Termで設定します)
公開鍵認証でアクセスするユーザーを作成
ユーザーの作成(※ユーザーを作成するため、rootにスイッチしておいてください)
/usr/sbin/useradd -d /home/ユーザー名 passwd ユーザー名 ↓以下が出力されます↓ Changing password for user ユーザー名. New UNIX password:パスワ-ド入力 Retype new UNIX password:再度パスワ-ド入力 passwd: all authentication tokens updated successfully. chage -l ユーザー名
“ユーザー名”には、作成するユーザー名を入力します。
-dはホームディレクトリを指定するためのオプションです。
useraddコマンドを使用するには、パスを通す必要がありますので、/usr/sbin/を付けてパスを通します(※rootスイッチ時にsu -でパスを通した場合、/usr/sbin/は不要です)。
passwdコマンドでパスワードを設定します。
5~8行目が順に表示されますので、このユーザーのパスワードを入力しEnterキーを押します(※passwd: all authentication tokens updated successfully.と表示されればパスワード設定は完了です)。
chage -lは作成したユーザーのパスワード有効期限の参照コマンドです。
“オプション(-lの部分)”を変更することで、パスワードの有効期限を設定できます。
manコマンドで対応可能なプロトコルバージョンと認証方式を確認
man ssh-keygen
表示内容を確認します。
-t type Specifies the type of key to create. The possible values are “rsa1” for protocol version 1 and “rsa” or “dsa” for protocol version 2.
RSA認証が可能で、プロトコルバージョン1と2(SSH1とSSH2)が使用できることが確認できます(サーバー環境は同じであるとは限りません。各自でご確認ください)。
※RSA認証は公開鍵暗号方式の一つで、公開鍵暗号の標準として広く普及しています。
※セキュリティ上SSH2で接続するようにしましょう。
公開鍵と秘密鍵の作成
認証鍵を作成したいユーザーにスイッチ
su - ユーザー名
“ユーザー名”に先程作成したユーザー名を入力します。
su -とすることで、作成したユーザー名のホームディレクトリに移動します。
suでスイッチした場合、環境設定を引き継いたままなので、カレントディレクトリがスイッチする前のままであったり、rootでしかパスが通らないコマンドもありますので、su -でスイッチしましょう!
ssh-keygenコマンドでプロトコルバージョンに応じた鍵ペアを作成
ssh-keygen -t rsa
表示内容を確認します。
Generating public/private rsa key pair. Enter file in which to save the key (/home/ユーザー名/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ユーザー名/.ssh/id_rsa. Your public key has been saved in /home/ユーザー名/.ssh/id_rsa.pub. The key fingerprint is: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX ユーザー名@XXXXXXXX
1行目から順番に表示されます。
2行目は「作成したユーザーのディレクトリ内に.sshディレクトリ、その中にid_rsa(秘密鍵)を作成しますか?」という意味です。
作成する場合、Enterキーを押します。
3行目は「パスフレーズを入力してください」という意味です。
パスフレーズは、SSH接続した際に入力するパスワードともrootのパスワードとも違うものを入力してください。
入力したら続けてEnterキーを押します。
4行目は「再度同じパスフレーズを入力してください」という意味です。
入力したら続けてEnterキーを押します。
そうすると、/home/ユーザー名の中に.sshディレクトリ、その中にid_rsaとid_rsa.pubが作成されます。
.sshディレクトリに移動する前に、.sshのパーミッションを確認します。
.sshのパーミッションを確認
ls -al
700になっていればOKです。
lsはカレントディレクトリにあるファイルを表示するコマンドで、-alオプションを付けることで、隠しファイル(.で始まるファイル)や詳細(パーミッション、グループ、所有者、サイズ、タイムスタンプ等)を一覧表示できます。
パーミッションが変わっていない場合、chmod 700 .sshでパーミッションを変更します。
authorized_keysの作成
cd .ssh cat id_rsa.pub >> authorized_keys chmod 600 authorized_keys rm id_rsa rm id_rsa.pub
cdコマンドで.shhディレクトリに移動します。
catコマンドでid_rsa.pubの内容をauthorized_keysに出力します。
chmodコマンドでauthorized_keysのパーミッションを600に変更します。
rmコマンドでサーバー上には必要ないid_rsaとid_rsa.pubを削除します。
サーバーからid_rsaとid_rsa.pubを削除する前に、公開鍵認証に必要なid_rsaを忘れずダウンロードしておきましょう。
個人的には、FTPやHTTP経由でのダウンロードはちょっと怖い気がするので、viで開きコピーしたものをローカルでペーストしました。
sshd_configの設定
sshd_config
vi /etc/ssh/sshd_config ↓viでsshd_configの以下設定内容を確認する↓ RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
viコマンドでsshd_configを開きます。
RSAAuthenticationがyesとなっていますので、RSA認証が可能な設定となっています。
PubkeyAuthenticationも同じくyesとなっていますので、公開鍵認証が可能な設定となっています。
AuthorizedKeysFileはauthorized_keysの格納されている場所です。
4~6行目はコメントアウトされていると思いますが、デフォルト値が上記のように正しく設定されていれば、コメントアウトしたままでも公開鍵認証は可能です(※設定が有効にならない場合はコメントアウトを外してください)。
sshd_configの設定を変更した場合、SSHを再起動
/etc/init.d/sshd restart
ターミナルエミュレータの設定(Tera Termでの設定)
1にパスフレーズを入力します。
2にはローカル環境上やUSB内等に用意した秘密鍵(id_rsa)を選択します。
毎回全て入力するのが手間な場合、[設定]→[設定の保存]で設定した内容をINIファイルに保存できますので、次回接続時からはそのINIファイルを[設定]→[設定の読み込み]から選択後接続すると、パスフレーズの入力のみで済みます。
最後に、ターミナルエミュレータで公開鍵認証での接続ができたのを確認した後、パスワード認証を無効にします(※パスワード認証を無効にすると、公開鍵認証でしかSSH接続できなくなりますので、設定の際はご注意ください)。
sshd_configの設定を変更
vi /etc/ssh/sshd_config ↓viでsshd_configの以下設定内容を確認する↓ PasswordAuthentication no /etc/init.d/sshd restart
viコマンドでsshd_configを開きます。
PasswordAuthenticationをnoとすることで、パスワード認証が無効になります。
sshを再起動し、設定を反映させます。
関連記事(※当記事と関連性が高いと思われる記事)
Webデザインの効率化を図る
2011/12/23Web制作で活用したいツール
2012/09/30gzip圧縮でWebコンテンツを高速化
2012/05/25サーバーの設定変更
2012/02/17よく使うLinuxコマンドの覚え書き
2012/01/29おすすめ書籍・商品(※当記事と関連性が高いと思われる書籍・商品)