SSH接続用の公開鍵認証作成
rootと作業用ユーザーにパスワードを設定していても、これは最低限のセキュリティ対策である。いくらパスワードを複雑にしたとしても、それが割れたらログインされる。そこで、SSH接続には公開鍵認証を利用する。これはサーバーに公開鍵を置き、クライアントはそれに対した秘密鍵で接続を認証する、というものである。認証に鍵を用いるため、秘密鍵となるファイルにアクセスできる環境からしかログインできない。
鍵を使用するユーザーの限定とパスフレーズ設定により、秘密鍵ファイルが漏洩したときの対策もおこなえる。
Macのターミナルを起動
ssh-keygenコマンドを実行する。
$ ssh-keygen
コマンドを実行すると、鍵ファイルの名前とパスフレーズをたずねられる。ファイル名はid_rsa、パスフレーズはある程度、複雑なもの(4文字以下だとエラーになる)を入力しておく。 ※コマンドを実行したら、.sshディレクトリーが作成されてそれ以下にid_rsaが作成されると思ったら、実行した場所にid_rsaが作成されていた。だから、以下ように.sshディレクトリーを作成してからコマンドを実行した。
生成に成功すると、以下のような出力結果がでる。
xxxxx:~ xxxxx$ cd xxxxx:~ xxxxx$ mkdir .ssh xxxxx:~ xxxxx$ cd .ssh xxxxx:.ssh xxxxx$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/Users/xxxxx/.ssh/id_rsa): id_rsa Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in id_rsa. Your public key has been saved in id_rsa.pub. The key fingerprint is: 68:ff:d3:94:f2:c9:24:6d:56:85:6c:a1:65:35:43:34 xxxxx@xxxxx.local The key's randomart image is: +--[ RSA 2048]----+ | .*E.| | ++ =| | .. . | | . . | | o S . o | | . . o B | | . @ . | | .. = | | .. | +-----------------+ xxxxx:.ssh xxxxx$ ls id_rsa id_rsa.pub
これで/Users/xxxxx/.sshに公開鍵id_rsa.pubと秘密鍵id_rsaが作成された。秘密鍵の方は他のユーザに見られないよう、パーミッションも変更しておこうと思ったが、パーミッションを確認したところ既に600の状態だったが一応実行した。
xxxxx:~ xxxxx$ cd xxxxx:~ xxxxx$ cd .ssh xxxxx:.ssh xxxxx$ ls -l total 16 -rw------- 1 xxxxx xxxxx 1766 8 15 00:54 id_rsa -rw-r--r-- 1 xxxxx xxxxx 399 8 15 00:54 id_rsa.pub xxxxx:.ssh xxxxx$ chmod 600 id_rsa xxxxx:.ssh xxxxx$ ls -l total 16 -rw------- 1 xxxxx xxxxx 1766 8 15 00:54 id_rsa -rw-r--r-- 1 xxxxx xxxxx 399 8 15 00:54 id_rsa.pub xxxxx:.ssh xxxxx$
サーバーのSSH設定を変更
はじめに、公開鍵認証でログインしたいユーザーのHOMEへ、公開鍵ファイルとなるid_rsa.pubを送信する。Macの場合、scpコマンドで転送する。id_rsa.pubがMac側のユーザーHOME以下の.sshディレクトリーにある場合、実行するコマンドは以下のようになる。
$ cd $ cd .ssh $ scp -P 22 id_rsa.pub xxxx@xxx.xxx.xxx.xxx:
-Pパラメータでポート番号を指定、@の前後にユーザーと接続先。その後に:を付けてサーバー上の転送先ディレクトリーを指定する。未指定の場合はHOMEに転送される。転送できたらサーバーにログインし、以下のようにコマンドを実行してゆく。
$ cd $ mkdir .ssh $ chmod 700 .ssh $ mv id_rsa.pub .ssh/authorized_keys $ chmod 600 .ssh/authorized_keys
ユーザーのHOMEに.sshディレクトリーを作成し、その中に公開鍵をauthorized_keysという名前で配置している。他のユーザーから読み取られないよう、ディレクトリーのパーミッションを700、公開鍵ファイルは600としている。これで公開鍵の準備は完了。
次はいよいよ、SSHの設定変更である。
変更には管理者権限が必要なので、suコマンドでrootになる。ちなみに通常のユーザーと管理者は、プロンプト先頭の文字で見分けられるようになっている(シェルによるのかもしれないが)。プロンプトが$なら通常ユーザー、#は管理者となる。
$ su - Password: #
次に/etc/ssh/sshd_configを編集する。viコマンドで設定ファイルを開く。
# vi /etc/ssh/sshd_config
ファイルを開いたら、PermitRootLogin(rootのログイン)とPasswordAuthenticatin(パスワードによるログイン)をnoに設定する。書式は設定名の後にyesで有効、noで無効、行頭に#でコメントアウトとなる。例えば、以下のように書く。
#PermitRootLogin yes PermitRootLogin no ...中略... #PasswordAuthentication yes PasswordAuthentication no
編集して保存したら、SSHデーモンを再起動する。
# service sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ]
設定に誤りがあれば、コマンド実行時にエラーメッセージが表示されるので修正する。ここまでの手順がすべて適切ならば、以降はパスワードログインが禁止され、秘密鍵の参照が必須となる。 ただし、VPSコントロールパネルのコンソールではSSHのパスワードによるログインを禁止していても、関係なくログインできるので気をつけてください。
設定が完了したら、sshで接続をする。
$ ssh xxxx@xxx.xxx.xxx.xxx -p 22
接続をするとパスワードをきかれるので、ssh-keygenコマンドを実行したときに設定したパスワード入力して接続を行う。接続するとローカルの.ssh以下に鍵ができている。
xxxx:.ssh xxxx$ ls id_rsa id_rsa.pub known_hosts