02.さくらインターネットVPSを使ってみる。〜sshを公開鍵暗号で接続してみる〜

注意事項
サーバー管理については全くの素人が調べながら書いているので、セキュリティ的に脆弱な設定方法などが多々あると思われます。詳しい方は優しくご指摘いただけると幸いです。

さて前回のssh接続から少し発展して、もう少し安全な方法でssh接続を行うように設定します。

前回の方法だと毎回ログインする時にパスワードを入力しないといけません。

sshで通信が暗号化されていても、プログラムで色々なパスワードをランダムで試されてもし乗っ取られたら。。。orz

そこで、今回は公開鍵暗号化方式という方法でssh接続を行い、且つsshの接続するポートを変更して、さらにパスワードでのログインを無効化します。

では早速、まずはMacのターミナルを起動します。

そして、ここでサーバーには接続せずに、Macで公開鍵と秘密鍵を作ります。

「ssh-keygen -t rsa」で鍵を作ります。「Enter file in〜」ファイルを保存するみたいな事を聞いてくるのでそのままEnterを押下します。

最後に 「Enter passphrase」と聞いてくるので、適当な文字を入力してEnterを押下します。もう一度聞いてくるので再度おなじ文字を入力してEnterを押下します。これは鍵を作る為の「キーワード」みたいな物ですかね?

ssh-keygen -t rsa
Enter file in which to save the key (/Users/tochi/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

これでMacに公開鍵と秘密鍵が出来上がりました。確認してみましょう。「ls -al」と入力してEnterを押下すると現在のディレクトリの一覧が表示されます。一覧に「.ssh」というディレクトリが出来ていれば正常に作成できています。

ls -al
drwx——   4 tochi  staff    136  9 16 19:10 .ssh

出来上がった鍵のうち公開鍵をサーバーに送信します。「sftp root@【サーバーのIPアドレス】」と入力してEnterを押下すると「Are you sure〜」と聞かれるので「yes」を入力してEnterを押下するとパスワード入力が求められるのでパスワード入力してEnterを押下します。「sftp>」と表示されれば接続は完了です。

sftp root@xxx.xxx.xxx.xxx
Are you sure you want to continue connecting (yes/no)? yes
password:
sftp>

公開鍵を送信します。「put .ssh/id_rsa.pub」と入力してEnterを押下すると、「Uploading〜」と表示された後にファイルが送信されます。「quit」と入力してsftpを終了します。

put .ssh/id\_rsa.pub
Uploading .ssh/id\_rsa.pub to /root/id\_rsa.pub
.ssh/id_rsa.pub                                                                                                                              100%  418     0.4KB/s   00:00
quit

sshでサーバーに接続します。「ls -al」でディレクトリ一覧を見ると先ほど送信した「id_rsa.pub」が表示されると思います。

ssh root@xxx.xxx.xxx.xxx
ls -al
-rw-r–r–  1 root root  418 Sep 16 19:25 id_rsa.pub

「mkdir .ssh」で.sshというディレクトリを作ります。そして「chmod 700 .ssh」でディレクトリの権限を変更し、「mv id_rsa.pub .ssh/authorized_keys」で公開鍵を.sshディレクトリの配下にauthorized_keysという名前で移動します。

ローカル、サーバー共に.sshフォルダは「chmod 700 .ssh」で、id_rsa、authorized_keysは「chmod 600 id_rsa」「chmod 600 authorized_keys」で権限変更を行ったほうがよさそう。

mkdir .ssh
chmod 700 .ssh
mv id_rsa.pub .ssh/authorized_keys

ログアウトして再度sshで接続してみてください。はじめの一回のみMacの秘密鍵にアクセスする為にパスワードを聞いてきます?(何故なんでしょう?)Macのパスワードを入力します。するとパスワード入力なしでサーバーに接続が行えるようになりました。やったね。

さて今はsshで公開鍵暗号化方式でもパスワードでもログインができる状態です。なので、公開鍵暗号化方式でしか接続できないようにパスワードログインを無効化します。ついでにsshで接続する際に通常使用するポート「22」を他のポートに変更します。

サーバーに接続している状態で「vi /etc/ssh/sshd_config」と入力します。これはviというエディタで/etc/ssh/sshd_configというファイルを開くという意味です。

vi /etc/ssh/sshd_config

開かれたsshd_configの中に「Port 22」「PermitRootLogin yes」という箇所があるので、下記の様に変更します。

ポート番号は一般的に使われていないポートを使用した方が良いです。ネットなどでポート一覧などで検索して調べてみてください。今回は「40022」を設定します。

行頭の「#」は消してください。ちなみにviでは入力する箇所で「i」キーを押下すると入力モードになります。変更したら「esc」を押下してコマンドモードに戻り「:wq」と入力して上書きして終了します。

Port 40022 # ←ここは任意のポート番号に変更してください。
PermitRootLogin without-password

sshのサービスを再起動します。「/etc/rc.d/init.d/sshd reload」と入力すると「〜[OK]」と表示されれば正常に再起動されました。一度サーバーからログアウトします。

/etc/rc.d/init.d/sshd reload
Reloading sshd:                                            [  OK  ]

いつも通りsshで接続を試みると、 接続できない旨のメッセージが表示されます。

ssh root@xxx.xxx.xxx.xxx
ssh: connect to host xxx.xxx.xxx.xxx port 22: Connection refused

今度はポート番号を指定して接続してみます。「ssh root@【サーバーのIPアドレス】 -p 【ポート番号】」と入力してEnterを押下するとサーバーに接続ができます。

ssh root@59.106.173.175 -p 40022

本当はrootユーザーではなくて一般ユーザーを作ってrootでのsshログインを停止した方がよりセキュリティは高いんでしょうけど、一般ユーザーだと色々と権限周りで上手く行かなかったので今回はrootで。。。

この辺のサーバー設定で体系的にまとまった本とかあったら教えてください。

続きはまた今度。

コメント欄で一般ユーザーを作ってログインした方がより安全と聞いたのでその方法を書いておく。 まずはサーバーにログインした状態で一般ユーザーを作成する。そして、そのユーザーにパスワードを設定する。

useradd 【ユーザー名】
passwd 【ユーザー名】

次に一般ユーザーにrootと同様の権限を付与する。コマンドで下記の様に入力する。

visudo

sudoersファイルの編集が可能なので、root〜の下に追加した一般ユーザーを記述する。

root ALL=(ALL) ALL
【ユーザー名】 ALL=(ALL) ALL

あとは、上記のrootユーザーと同様に一般ユーザーもsshの公開鍵方式で接続出来るように設定します。
この場合にはrootユーザーによるssh接続を完全に拒否しても問題なくなるので「/etc/ssh/sshd_config」をその様に変更します。

PermitRootLogin no

これで新規に追加した一般ユーザーがssh公開鍵方式でしか接続できなくなりました。
権限が必要な処理を行うときはsudo〜でroot権限の処理が行えるようになります。

ついでに毎回「ssh 【ユーザ名】@【ホスト名】 -p 4022」とか打つのは面倒なので「.ssh/config」を設定します。
ローカルに「.ssh/config」を作成して下記の様に設定します。

Host 【好きな名前】
User 【ユーザー名】
HostName 【ホスト名】
Port 40022

これで下記のように打てば該当のサーバーに接続出来るようになります。

ssh 【好きな名前】