ssh鍵でパソコンへお洒落に侵入する
離れた場所にある別のパソコンに侵入というワードにワクワクしちゃう
archlinux環境でsshを使い、 リビングのソファーに寝転びながらノートパソコンで 離れた場所にあるデスクトップパソコンを操作しましょう。 これを実現するために、このノートでは以下の準備を行います。
- avahiサービスの準備
- デスクトップパソコンでsshデーモンの起動の準備
- ノートパソコンでssh鍵の作成
- ノートパソコンで作成した公開鍵をデスクトップパソコンのアカウントに登録
- デスクトップパソコンでsshデーモンがパスワード認証を拒否する設定
お家ネットワークの名前解決はavahi
まず、パソコン間での通信を行う場合、お互いのパソコンを認識するためにIPアドレス(127.0.0.1みたいなやつ)を使います。 そして、このIPアドレスは数字の羅列で人にとって優しくないので、通常、文字列(いわゆるドメイン名、google.comみたいなやつ)を紐付けて利用されています。 ここで、公共のインターネット空間上では、これら、文字列とIPアドレスの紐付けは、公的機関に管理され、公開された信用のあるサーバーに問い合わせて、 文字列からIPアドレスやその逆がわかるようになっています(巷では名前解決等と言われる)。
一方で、このノートで行う「お家の中のインターネット環境」は、 大体はプライベート空間であり、IPアドレスと文字列の紐付けもされてい無いのが通常です。 ですから、例えば、ノートからデスクトップパソコンへsshする場合のコマンドは、次のようになります。
$ ssh neko@192.168.0.103
しかし、これは明らかにイケてません! もし、デスクトップパソコンのホスト名が「madokita」なら、当然、
$ ssh neko@madokita
な感じになってほしいのです。
そのためには、名前解決を自分で行う必要があります。 しかし、一度、「linux 名前解決 仕組み」あたりでググってみてください。 気軽にやるには、複雑でボリュームもあり結構面倒くさい話なのです。 (まぁ、こういうなの好きな人は、自前のDNSサーバーを立て、なんか自分もインターネットの一部になっている気分に浸るのも楽しいかもしれませんが)
そこで、このノートでは、お家内で使うにはとてもお手軽で、 そして、簡単に名前解決してくれる「avahi」というサービスを利用します。 このサービスを利用すれば、プライベートネットワーク上では以下のような感じで、 他のパソコンを認識することができます。
$ ssh neko@madokita.local
そう、自分で定義しているホスト名に「.local」を引っ付けるだけで、すべて解決してくれるのです。
sshデーモンとsshクライアント
さて、sshのサービスを利用する場合、侵入する方とされる方どっちがどっちだか混乱する事が多々あります。 このノートでは、 据え置き型の比較的高性能なCPUを積んだ「デスクトップパソコン」が侵入される側になります。 一方、CPUの正確な型番とかが良くわからないアマゾンのセールで2万円弱で売っている中国産ノートパソコンが侵入する際に操作するパソコンです。 これをソファーの上で寝そべって操作しながら、メインのデスクトップパソコンに侵入することにします。 どっちがどっちかイメージが持てましたかー?
侵入される側のデスクトップパソコンは、 外部からの接続を許すデーモンが起動されている必要があります。 それが「sshd」すなわち、sshデーモン(sshサーバーとも言われる)です。 ですから、デスクトップパソコン側では、「sshデーモンの設定」を行う必要があります。
一方、侵入する側のノートパソコンにはデスクトップパソコンへの接続を要求するsshコマンドがインストールされていれば良いだけで、 sshデーモンの準備や起動は必要ありません。
ssh鍵を使った安全な接続
さて、ノートパソコンのターミナルからsshコマンドを使って、 デスクトップパソコンへ接続の要求をすると、 パスワードの入力が求められます。 そして、このパスワードを入力すると、 ノートパソコンのターミナル内にデスクトップパソコンのシェルが開きます。
しかし、 今では一般的に、外部からのログインの為に「パスワードを入力する」という行為自体、 セキリティが低いと認識されます。 それは、ネット越しでのパスワードのやり取りが盗まれる可能性があるという理由もありますが、 一番のセキュリティ上の問題は、 パスワードが分かりさえすれば、 誰でも何処からでもログインできてしまうというところにあります。
そこで、逆説的に登場するのが、 「んじゃ、パスワードつかわなかったらいいやん!」という発想です。 そして、それを可能にするひとつの方法が、「ssh鍵」です。
そもそも、パスワードというのは、 「本人しか知らない」から、 それを知っているということは「本人ということを証明している」というものでしかありません。 つまり、「本人を証明」する仕組みが他にあるなら、パスワードはいらないのです。 そして、その本人を証明する仕組みは、今や、指紋認証や顔認証様々なものがありますが、 その一つが「ssh鍵」認証なのです。
「ssh鍵」に興味があれば、「SSH鍵 ArchWiki」がおすすめです。
さて、このノートでは、「ssh鍵」での本人認証の設定を済ませたあと、 sshデーモンの設定で「パスワードログインを拒否する」ようにします。 つまり、最終的にデスクトップパソコンへのsshログインは、パスワードを知っていてもログイン出来なくし (もちろん、デスクトップパソコンに直接ログインするときはパスワードでログインします)、 正当なssh鍵を持っているパソコンからだけログインができるようにします(再度になりますが、その際、パスワード入力等、手動の認証手続きは何もいりません)。 まさに、セキュアシェル!!ですよね。
では、以降、いよいよ、実際の手順です。
avahiサービス
この作業は、デスクトップパソコンとノートパソコンの両方で行います。
avahiパッケージとnss-mdnsパッケージをインストールします。
$ sudo pacman -S avahi nss-mdns
avahiのサービスをシステム開始時に起動するようにシステムに登録します。
$ sudo systemctl enable avahi-daemon
avahiの設定ファイル/etc/nsswitch.conf
を編集します。
$ sudo vim /etc/nsswitch.conf
resolveとdnsのどちらより前に mdns_minimal [NOTFOUND=return] が含まれるように hostsの行を変更します。
...
hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns
...
作業が終わったら、どちらのパソコンも再起動します。 両方のパソコンが立ち上がったら、ノートパソコンで以下のコマンドを実行してみましょう。 [desktopPC_hostname]の部分は、あなたのデスクトップパソコンのホスト名に置き換えてください。 うまく行ったら、今度は逆にデスクトップパソコンからノートパソコンへもpingを打って、名前解決されるか試してみましょう。
$ ping [desktopPC_hostname].local
avahiは名前解決だけでなく、ローカルネットワーク内のサービスの所在(プリンタとか共有ストレージとか)を知らせてくれる機能を色々と持っています。 興味があればまず、「Avahi ArchWiki」から始めてみましょう。
sshデーモンの起動
デスクトップパソコンでsshデーモンを起動
まずは、デスクトップパソコン側で作業を行います。
opensshパッケージをインストールします。
$ sudo pacman -S openssh
次のコマンドを使って、sshデーモンを起動します。
$ sudo systemctl start sshd
ノートパソコンからデスクトップパソコンへ接続テスト
続いて、ノートパソコン側で次の作業を行います。
opensshパッケージをインストールします。 実は、sshはデーモンもクライアントも同じパッケージに入っています。
$ sudo -S openssh
sshコマンドでデスクトップパソコンへ接続します。 sshコマンドは、以下のような書式になります。[desktopPC_username]@[desktopPC_hostname].localの[desktopPC_username]と[desktopPC_hostname]の部分は、デスクトップパソコンのホスト名とそこでログインするユーザー名に置き換えてください。
ssh [desktopPC_username]@[desktopPC_hostname].local
例えば、デスクトップパソコンのホスト名がmadokitaであり、そのデスクトップパソコンのユーザーアカウントであるnekoというユーザーでログインする場合は、次のようなコマンドを実行することになります。
$ ssh neko@madokita.local
はじめて接続すると以下のようなメッセージが出力されます。
インターネットの世界では、ドメイン名やIPアドレスは、その仕組み上、簡単にすり替えることが出来ます。 たとえば、このmadokitaに関するIPはavahiに問い合わせて得ています。 ここでよく考えてみてください。あなたは、avahiがmadokitaのIPを返していると思っていますが、 仕組み的には、avahiは別に何のIPアドレスだって好きなものを返すことができるのです。
そこで、ssh接続では、問い合わせているホストが本当に自分で思っているホストかどうかを検証する仕組みが提供されます。 具体的には、ホスト側の公開鍵を持っている場合には、それで自動的に、持っていない場合には、公開鍵から求められるフィンガープリントで目視して確認を行います。 セキュリティに関する関心を高めるために、一度は、以下のサイト等に目を通して、何が危険で、何をすることでそれを防げるのかという仕組みを把握しておきましょう。
SSHにおけるフィンガープリントとは。ホスト認証とあわせて解説
上記のページで紹介されているように「フィンガープリントによる確認」を行ってみましょう。 デスクトップパソコン側で以下の作業をします。
$ cd /etc/ssh
ここに、ssh_host_なになに_key.pub
というファイルがいくつかあります。
先のメッセージでは、「ED25519 key fingerprint」と書かれていたので、なになにの部分がED25519のものを使って、以下のコマンドを実行します。
$ ssh-keygen -lf ssh_host_ed25519_key.pub
そうすると、公開鍵からのフィンガープリントを表示してくれるので、これが、sshログインの画面で表示されていたフィンガープリントと見比べて、 接続しようとしているホストが正しいかどうかを判別することが出来ます。
接続しようとしているホストが自分の思っているデスクトップパソコンであると判断出来た場合には、プロンプトに対して「yes」を入力してリターンします。 そうすると、ノートパソコン側のsshクライアントの設定の中に「知っているホスト」として、デスクトップパソコン側の公開鍵が登録されます。
接続先が間違いないことが確認されたので、ログインするためにパスワードの入力が促されます。
デスクトップパソコンのログインするユーザーのパスワードを入力して、リターンします。
これで、デスクトップパソコンのシェルが開きました。 ノートパソコンから、デスクトップパソコンへの侵入成功です!
ssh鍵の作業
いま、ノートパソコンからデスクトップパソコンへログインしているはずですが、一旦、exitコマンドでログアウトしてください。 sshで作業をするようになると、気を許すと今、自分がどこで何の作業をしているのかが把握できなくなってしまいます。 できれば、最低限、プロンプトにホスト名を表示する機能を入れておき、また、自分が今どこにいるかを積極的に意識するようにクセをつけましょう。 でないと、間違えて大切なファイルを書き換えたり捨てたりしてしまいます。
ノートパソコンでssh鍵を作成
今から、ノートパソコン側にsshの鍵を作成します。「鍵」は、「秘密鍵」と「公開鍵」という2つのファイルとして作成されます。 自分がノートパソコンのシェルにいることを確認したら、以下のコマンドを実行しましょう。
$ ssh-keygen
鍵ファイルは、~/.ssh/ディレクトリ以下に作成されます。 鍵ファイルのファイル名を変更する場合に、プロンプトにそのパスを入力します。 デフォルトで良い場合は、何も入力せずにリターンキーを押せばOKです。 ここで、もし、既に鍵が存在している場合は、上書きするかどうかの確認が出ます。
続いて、鍵ファイルを暗号化する場合の、その暗号を解くパスワードを入力します。 このパスワードを設定すると、保存されている鍵ファイルが暗号化され、 このファイルを万が一盗まれたとしても、パスワードがない限り、鍵ファイルを使うことが出来ないので、よりセキュアになります。 一方、sshログインする場合に、その認証に必要な鍵を取り出すため、パスワード入力が必要になります。
ここでこの「パスワード」は、鍵ファイルの暗号化を解くためのパスワードであり、 ユーザーアカウントのパスワードではないことに注意が必要です。 そして、もちろん、このパスワードを忘れると、ssh鍵の暗号が解けず認証ができなくなります。 (但し、ssh認証自体はまた、新しい鍵を作ってホストに登録すればいいだけであり、 これを忘れたからアカウントにログインができなくなるわけではありません。)
うちでは自分しか使わないノートなので、暗号化していません。 自分の環境で鍵ファイルの暗号化が必要かどうかは、各自で判断しましょう (自分以外のroot権限者がいる等の場合、暗号化しないと鍵ファイルは無防備になります)。 パスワードがいらなければ、空白のままリターンでOKです。 パスワードは確認されます。
以上の手順で鍵が作成され、画面には上記のような模様が出て、鍵の作成作業が終わります。
ノートパソコンの公開鍵の内容をデスクトップパソコンへコピー
続いて、今作成した、ノートパソコンにある鍵のうち、
公開鍵の内容をデスクトップパソコンのログインするユーザーアカウントの~/.ssh/authorized_keys
というファイルにコピーします。
この作業を実際になってくれるのがssh-copy-idコマンドで、次の書式になっています。
ssh-copy-id [desktopPC_username]@[desktopPC_hostname].local
sshコマンドのときと同様に、[desktopPC_username]@[desktopPC_hostname].localの[desktopPC_username]と[desktopPC_hostname]の部分は、デスクトップパソコンのホスト名とそこでログインするユーザー名に置き換えてください。
例えば、デスクトップパソコンのホスト名がmadokitaであり、そのデスクトップパソコンのユーザーアカウントであるnekoというユーザーでログインする場合は、次のようなコマンドを実行することになります。
$ ssh-copy-id neko@madokita.local
作業が終わったら、sshコマンドでログインしましょう。 例えば、madokitaホストのnekoにログインするには以下のとおりです。
$ ssh neko@madokita.local
鍵を暗号化していない場合、いきなり、シェルのプロンプトが出たはずです。
そうです、もうパスワードを入力しなくてもデスクトップパソコンに侵入が成功しました!
念の為、このログインした先であるデスクトップパソコン側の~/.ssh/authorized_keys
ファイルの内容をみてみましょう。
ノートパソコン側で作成した公開鍵の内容と同じ内容の鍵がファイルの中に書き込まれているはずです。
この~/.ssh/authorized_keys
には、他のサイトの公開鍵もどんどん付け足されて行きます。
なお、鍵の名前を変更していたり、ssh受付のポートが違っていたりする場合には、ssh-copy-idのオプションで指定できます。 先に紹介したarchwiki ssh鍵の中の「リモートサーバーに公開鍵をコピー」の辺りが参考になります。
パスワードでの外部からの接続をできなくする
ssh鍵認証の設定が終わった段階で、デスクトップ側のsshデーモンの設定を変更し、
外部からパスワード認証での接続をできなくします。
ここからは、デスクトップパソコン側で作業します。
まず、/etc/ssh/sshd_fonfig
ファイルをルート権限で開きます。
ssh_fonfig
ではなくて、sshd_fonfig
ファイルです。
紛らわしいのですが、sshとsshdの違いに十分注意します。
$ sudo vim /etc/ssh/sshd_fonfig
ファイルの中に、パスワード認証を許可する以下の記述があります。
...
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
...
これを no に変更しましょう。
...
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
...
変更を保存したら、以下のコマンドで念の為、デスクトップパソコンのsshデーモンを再起動します。
$ sudo systemctl restart sshd
では、接続出来なくなっていることを確認しましょう。 実は、デスクトップパソコンから、デスクトップパソコンへもssh接続要求ができます。 以下のコマンドを試してみましょう。
ホストの確認の後、"Permission denied (publickey)"と表示されてログインを拒否されたはずです。 実はパスワード認証が有効ならば、パスワードを打ち込むことで自分のアカウントに自分でログインできるのですが、 パスワード認証を認めない設定にしたので、 自分の認証に対する公開鍵を自分に登録していない自分は認証されないのです(ややこしぃ)。
以上で、ssh鍵接続の設定が完了しました。 デスクトップパソコン上で、sshデーモンが、システム起動時にいつでも立ち上がるように、次のコマンドを最後に忘れずに入力しておきます。
$ sudo systemctl enable sshd
何かの作業の時はパスワード認証ができるように設定を戻せばOK
さて、sshデーモンの設定で、パスワード認証を出来なくする設定をすると、 新しい別のノートパソコンでもデスクトップパソコンにアクセスしたくなった時に、 公開鍵を登録しようとして、上述した"ssh-copy-id"コマンドを使ってもエラーになって登録できません。 しかし、ここでパニックになる必要はありません。 焦らずに、デスクトップパソコン側のsshデーモンのパスワード認証設定を一時的に変更します。
$ sudo vim /etc/ssh/sshd_fonfig
ファイルの中に、パスワード認証を許可する以下の記述を見つけます。
...
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
...
これを一旦、yesに変更しましょう。
...
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
...
変更を保存したら、以下のコマンドで念の為、デスクトップパソコンのsshデーモンを再起動します。
$ sudo systemctl restart sshd
この手順で一旦、パスワード認証を許可すれば、上述と同様にssh-copy-idコマンドを使って、 新しいノートパソコンの公開鍵登録作業ができるようになります。 この作業が終わったら、改めてデスクトップパソコンのsshデーモン設定をパスワード認証拒否に戻し、 デーモンを再起動すればOKです。
これは、ssh鍵を暗号化したときにパスワードを忘れてた時等、 ssh鍵を新しいものに変える時はいつでも、上述のようにパスワード認証に関する設定を変更して、作業をすればOKです!
sshデーモンを立ち上げまくって、自由自在に飛び回る
このノートでは、まず、混乱しないように、リモート(デスクトップパソコン)とローカル(ノートパソコン)を大げさに区別して紹介しました。 しかし、慣れてくれば、どのパソコンでもsshサーバーを立ち上げておけば、どのパソコンからもどのパソコンへも接続できるようになります。 例えば、ノートパソコンからデスクトップパソコンにログインして、そのそのデスクトップパソコンからノートパソコンへログインして、、、等、 ソファーに寝そべったまま、まさに、パソコン間を飛び回ることができるようになります。
めちゃめちゃ便利になる一方で、「これを他人にやられたら、、、」という実感から、 セキュリティに対する関心も高まると思います。 お洒落にセキュリティの知識も得ていきましょう。
No comments: