鍵交換の設定をして、パスワード認証を卒業する

ここでは、パスワード認証を卒業して、鍵認証でログインする方法を解説します。

IDとパスワード認証のみでサーバにログイン出来る状態というのは、ログインする相手が本当に正規のユーザなのかについて保証する事が出来ません。鍵認証は、あらかじめサーバにログインするユーザの公開鍵をサーバに登録することで、正規のユーザであることを証明しながらログイン認証を行う一つの方法です。細かい仕組みなどについてはこちらのサイトに詳しいので御覧ください。

参考:SSHで公開鍵認証を使った認証手順

まずは接続するローカルマシンで公開鍵と秘密鍵を作りましょう

自分のMacで公開鍵・秘密鍵を作ります。Windowsの場合はTeraTermで作ることが出来るはずです。

鍵を作るのは、自分のマシンです。これまでの作業はリモートサーバにログインして行っていると思いますので、もう一つターミナルのウィンドウを増やしましょう。[⌘ + n]を押すと新しくウィンドウが増えます。[⌘ + t]を押すとタブが増えます。おこのみでどちらでもどうぞ。

ssh-keygen -t rsa

新しいターミナルが開くと、そこはローカルマシンになっていると思います。ターミナルからこのコマンドを打ちましょう。キージェネレーションコマンドです。これ打ってEnter。パスワード設定は自己責任で。

因みに、さくらのVPS上で同じようにコマンドを打つと、同様にキーが作られます。さくらのVPSから、その他のサーバに鍵認証でログインしたいという場合には、同様のフローで鍵交換をすると色々と捗ります。(ここでは触れませんが、例えばサーバスペックアップの為にサーバの移転をするという場合には、元サーバのファイルをそのまま転送先サーバに転送するのが楽なのですが、鍵交換をしておくとそれが簡単に実現できます)

先ほどのコマンドを打つと、 ~/.ssh/ というフォルダの中に2つのファイルが作られます。

~/.ssh/id_rsa.pub
~/.ssh/id_rsa

この2つ。 .pubが付いている方が公開鍵で、ついていないほうが秘密鍵です。秘密鍵は秘密ですので、誰にも教えてはいけません。

~/ と書きましたが、ここでは作業ユーザですので、絶対パス(サーバ内のフォルダ構造で見たパス)は

/home/yourname/.ssh/

を表しています。

パスワードを設定した場合は、キーチェインに秘密鍵を登録しておくと楽(Macのみ)

先ほどのkeygenでパスワード設定した場合ですが、いちいちパスワード入力するのは以外と手間です。そこで、iOSのキーチェインを使いましょう。

ssh-add -K ~/.ssh/id_rsa

ローカルマシンの公開鍵を、サーバに登録する

公開鍵が作られたので、次はその公開鍵をサーバに登録しなくては行けません。え、どうやって?と思う人もいると思いますが、幾つかの方法があります。

  1. ローカルの公開鍵をサーバに転送して登録する
  2. ssh-copy-idを使って登録する

1は、これからも似たようなことを行う可能性が高いので、何が起きているのかについて追ってみるのをおすすめします。

2は、専用スクリプトで一発登録!という感じなので、とにかく手軽にまずはやりたいよという場合は2を選んでください。

1の下準備

あらかじめサーバ側で作業が必要になります。先ほど使った作業ユーザのままで以下のコマンドを打ってください。

mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

 

mkdir .ssh というコマンドは .ssh というディレクトリ(フォルダ)を作りなさいという意味です。

touch というのはファイルのタイムスタンプ変更コマンドなのですが、ファイルが存在しない場合は新しくファイルを作ってくれます。
touch .ssh/authorized_keys ですので、 ~/.ssh/以下に authorized_keysというファイルを作ってくださいよというコマンドです。

chmod というのはファイルやフォルダのパーミッションを変更するコマンドです。恐らくこちらの読者さんであれば、FTPを使ってファイル転送をした経験がある人も少なく無いと思います。755とか777とか644とか、やりましたよね?あれです。
chmod 700であれば、ファイルパーミッションを700にしなさいというコマンドです。 chmod 700 .ssh ですので ~/.ssh というディレクトリのパーミッションを700にしなさいという意味です。
chmod 600 .ssh/authorized_keys は ~/ssh/authorized_keys というファイルのパーミッションを600に変えなさいの意です。

.ssh というディレクトリには公開鍵・秘密鍵が格納されるフォルダです。先ほどローカルマシンでkeygenをしましたが、それも ~/.ssh の中に入っている事がわかると思います。

authorized_keysというのは、認証する公開鍵のリストです。一行に一つの公開鍵が書き込まれており、ここに書かれている公開鍵であれば鍵認証に使えますよという事になります。

フォルダとファイルのパーミッションを変える意味ですが、これを適切に設定していないと鍵認証が動かないからです。設定したはずなのに、鍵認証でログインできない!という場合にはパーミッション設定がちゃんとされていないという場合がままありますのでご注意ください。

1 ローカルの公開鍵をサーバに転送して登録する方法

1-1 簡単ワンライナー(1行コマンド)で登録する方法

これは簡単です。面倒な人はこちらをどうぞ。

cat ~/.ssh/id_rsa.pub | ssh [email protected]アドレス 'cat >> .ssh/authorized_keys'

yournameはあなたの作業ユーザ名。IPアドレスは契約したさくらのVPSのIPアドレスに変更してください。

catというのは、ファイルの中身を出力するコマンドです。試しにこれだけを実行してみてください。ファイルの中身が表示されたと思います。

cat ~/.ssh/id_rsa.pub

本当に中身なのか気になる人は、vi(vim)エディタでファイルを開いてみてみましょう。

vim ~/ssh/id_rsa.pub

同じものが表示されると思います。エディタの終わり方は :q (コロン→qの順で押す)です。もし、 i をおしてしまってインサートモードになってしまったらこれでは終われませんので、落ち着いて一度escキーを押し、コマンドモードに戻ってから :q! と押してください。 !を追加しているのは、インサートモードにしてしまうと恐らく何かしらの文字を入力してしまっているからです。ファイルに変更がある場合は :q ではviエディタを終えることが出来ませんので、! を付けて強制終了します(ファイルの変更が保存されずに閉じられます)。

次に、 | の意味です。これはパイプと言って、前後のコマンドを接続する意味があります。ここで言うと、最初のcatと次のsshを接続しています。

ssh [email protected]アドレス

これは、ログインする時に使ったかと思うのですが、yourname アカウントでIPアドレスのサーバにssh接続しますよというコマンドです。

'cat >> .ssh/authorized_keys'

これは先程のcatの中身を、.ssh/authorized_keys に追加(>>)しますよという意味です。

ここまでを総合すると、ローカルマシンの~/.ssh/id_rsa.pubをリモートサーバ(さくらのVPS)に作業ユーザ(yourname)でログインして、.ssh/authorized_keysに加えますよというコマンドであるという事になります。たった一行なのに、説明に要する行数が凄いですね…!

1-2 ファイル転送から一つ一つやってみる方法

基本的には1-1を1つずつ順を追ってやる方法です。これも作業はローカルマシンではじめます

scp ~/.ssh/id_rsa.pub [email protected]アドレス:
ssh [email protected]アドレス
cat id_rsa.pub >> .ssh/authorized_keys

先ほどの説明とほとんど同じですね。scpコマンドはファイル転送用のコマンドです。(正確にはファイルをコピーするコマンドです)
IPアドレスの後に : (コロン)が打ってありますが、これは転送先の場所を指定する為に重要です。ここでは何も書かれていないので yournameアカウントのルートディレクトリ(/home/yourname/)に転送されます。例えば

scp ~/.ssh/id_rsa.pub [email protected]アドレス:~/.ssh/

とすると、id_rsa.pubがリモートサーバの~/.ssh/以下にコピーされます。(実際に、リモートサーバで公開鍵作っていた場合には上書きされてしまうのでこのコマンドは使わないでくださいね)

次に、ssh [email protected]アドレスでさくらのVPSにログインします。

cat id_rsa.pub >> .ssh/authorized_keysは1-1でも説明した通り、id_rsa.pubの内容を.ssh/authorized_keysに追加しますよというコマンドです。

これで完了です。

2 ssh-copy-idを使って登録する方法

専用のコマンドです。1が分かっていれば鍵交換なんて何度も何度も行うものでもないのでこちらのコマンドを覚えていられないという気もしますが、1に挫折した人がいらっしゃいましたらこちらの方法をお試しください。

下準備

MacにXcodeをインストールしておく必要があります。

次に、Command Line Tools for Xcodeのインストールをインストールします。

ターミナルで以下のコードを打ちます。ローカルマシンで作業してください。

xcode-select --install

インストール用のウィンドウが出てきますのでインストールボタンを押してください。これで完了です。

Homebrewをインストールする

Homebrewのサイトの冒頭にインストール用のコマンドが書かれているのでこれをそのまま実行します。ローカルマシンのターミナルで実行してください。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

途中にEnterを押す部分と、Macのパスワード入力が促されますので適宜お願いします。

終わったら、Homebrewを最新版にしましょう。(一応)

brew update

これで完了です。

ssh-copy-idをインストールする

brew install ssh-copy-id

インストールが終わったら、鍵交換をしましょう。

ssh-copy-id [email protected]あなたのIPアドレス

これですべての設定をしてくれます。

最後に鍵認証ができるかどうかを確認しましょう

ターミナルで新しいウィンドウ(もしくはタブ)を開き、鍵認証でログイン出来るか試しましょう。

ssh [email protected]あなたのIPアドレス

これでパスワード入力を求められなければ鍵認証の設定が完了しています。

パスワード認証を禁止する

ここまでで、鍵認証が完成していると思いますので、次はパスワード認証を禁止しましょう。この設定をしておけば、パスワードでログインすることができなくなります。つまり、鍵認証が成立する相手しかログインすることが出来なくなるという事です。

作業は、リモートサーバにログインした状態で行います。先ほどの確認時にログインしていますので、そのままの状態で以下のコマンドを実行しましょう。

sudo vi /etc/ssh/sshd_config

sudo(管理者権限で以下のコマンドを実行) vi (エディタ)で /etc/ssh/以下にある sshd_configというファイルを開きます。

/#Port 22

と打ち、先頭の#を削除します。上記コマンドを打てば、カーソルが#に行っていると思いますので x をおして#を削除します。
削除したら、右矢印か l を連打するか、 f2 とおして22の2の部分までカーソルを移動します。
22をxx とおして消したら、番号を適当なものに変更しましょう。
1025以上65535未満で設定をしてください。これがssh接続ポートになります。(初期設定は22です)

/PasswordAuthentication

と入力し、Enterを押しましょう。 / は検索ですから、PasswordAuthenticationという文字列を検索するという事になります。

すると、

# PasswordAuthentication no

と書かれていると思います。パスワード認証 を noとするコードが、先頭の#でコメントアウトされています。

そこで

0x

と押してください。0は行の先頭にカーソルを移動するviのコマンドです。xは前にも紹介しましたが、カーソルのある場所の文字を削除するコマンドです。

そのちょっとしたに、

# ChallengeResponseAuthentication no

という行があると思いますので、こちらも同様にコメントアウトを解除(#を削除)してください。

その行までの移動は、先ほどと同様に /ChallengeResponseAuthentication として検索で移動してもよいですし、 j を何度か押して下の行に移動しても良いです。ChallengeResponseAuthenticationをコピーする手間を考えると、jで移動して削除するのが良いでしょうか。

ここまで出来たら、 :wq とおして保存してviを終了しましょう。

きちんと設定ができているかを確かめよう

上記の設定が反映されているかを確かめます。まずは、設定を反映するために、sshdを再起動しましょう。

sudo service sshd restart

Centos7の場合は

sudo systemctl restart sshd

ここまでやったら、もう一つウィンドウを開きましょう。今ここで使っていたウィンドウは閉じずに置いておきます。(これをログアウトしてしまって、いざログインしようと思ったら、認証が通らない!となると面倒です。コンパネからサーバ再起動して云々…みたいな方法はあるので、問題はないっちゃ無いのですが、とにかく面倒ですから、ログアウトせずに新しいウィンドウからログインするようにしてください。

ログインコマンドは、そろそろ覚えたでしょうか。

ssh [email protected]あなたのIP -p 先ほど決めたポート番号

です。問題なくログイン出来たら、先ほど閉じなかった画面は閉じてしまって良いですよ。

ターミナルからの脱出は、exitコマンドを打ちます。

さくらのVPSで一度exitする→自分のMacのターミナルが表示される→試しにもう一度exitを押してみる→

exit22

プロセスが完了しましたと出たら⌘ + wでウィンドウ(タブ)を閉じましょう。リモートサーバからexitした時点で閉じてしまってokですけどね。

ssh接続コマンドを楽にしよう

毎度毎度以下のコマンドを打つのは面倒だったりします。

ssh [email protected]あなたのIPアドレス -p あなたの決めたポート番号

そこで、設定ファイルを書いて、簡易的にログイン出来るようにしてみましょう。

vi ~/.ssh/config

.ssh以下にconfigファイルを作りましょう。

Host server1
  HostName あなたのIP
  User yourname
  Port あなたの決めたポート番号

と書きます。すると

ssh server1

でログイン出来る様になります。

server1という文字は任意なので適宜決めてください。

viの使い方講座

とは言え、そもそも書き方を教えていませんでした。viエディタでファイルを開いたら、 i を押してください。インサートモードというモードになりますので、この状態ですと、普段使っているエディタと同じような機能だと思います。コードをコピペしてしまって構いません。

ペーストが終わったら esc キーを押しますと、コマンドモードに戻ります。戻ったら、 :wq でエディタを抜けましょう。

ここまでやったら

ssh server1

と打ってみてください。サーバにログイン出来ることが確認出来ると思います。

次は、大事なセキュリティです。→iptablesの設定をしましょう

オススメNginx本

nginx実践入門 (WEB+DB PRESS plus) 単行本(ソフトカバー) – 2016/1/16

nginxを現場で活用するための知識を、実践的なノウハウを交えて解説した書籍です。nginxのインストール方法や基本的な設定方法からはじめ、nginxを利用した「静的コンテンツ配信サーバ」「HTTPSサーバ」「Webアプリケーションサーバ」「大規模コンテンツ配信システム」の構築方法をそれぞれ詳しく紹介しています。後半ではnginxサーバのモニタリングやログの収集、そして軽量スクリプト言語Luaでnginxを拡張する方法について解説しているので、nginxをこれから使う方はもちろん、さらに活用したい方にもお勧めです。

公開日:
最終更新日:2016/02/17