カテゴリー「SSH」の7件の記事

2019年10月 6日 (日)

パスワード認証禁止 & 公開鍵認証でsshfsを使う

SSHFSは、SSHを介してリモートシステムをローカルフォルダにマウントすることができるファイルシステムクライアント。SSHFSを利用すれば、ネットワーク越しにも関わらず、まるでローカルにファイルが存在するかのように取り扱えます。ファイルをまとめてコピーとか、非常に楽ですね。

さて、このSSHFS。SSHの設定によっては、「パスワード認証が許可されたまま」の状態になっている場合があります。個人的にはこれが嫌なので、パスワード認証を禁止し、公開鍵認証でのみSSHFSを行う設定の流れを整理しました。内容的にはSSH,SSHFSの導入から使用まで含めての手順メモになります。(ただし、sshのパスワード認証禁止設定リモートホスト側をいじれることが前提です。)

なお、今回の作業環境は Debian10 です。

以下、簡単な作業表です。

【簡易作業表

  ローカルホスト側の設定 リモートホスト側の設定
【① ssh関連の設定】   (1)openssh-server の導入
  (2)パスワード認証の禁止化
(3)openssh-client の導入  
(4)秘密鍵・公開鍵の作成  
  (5)公開鍵の登録
【② sshfs設定・マウント】 (11)sshfs の導入  
(12)リモートホスト先をマウント  
(13)アンマウント  

 

ほぼsshの設定の説明になってますが。

ではいきます。

 

 

【① ssh関連の設定 

【リモートホストにて】   

※ 当然のことながら、(1)(2)の作業を行えるのはリモートホスト管理者です。自分が管理者、もしくは管理者権限がなければ、この作業はできません。


【(1)openssh-server のインストール】 

# apt install openssh-server
  または
$ sudo apt install openssh-server

(apt とは何ぞやな方は「apt-get チュートリアル(apt チュートリアル)」を参考に。)

 

【(2)パスワード認証の禁止化】 

  ルート権限で「/etc/ssh/sshd_config」ファイルを編集します。

# vi /etc/ssh/sshd_config
 または
$ sudo vi /etc/ssh/sshd_config

などでファイルを開き、以下の項目を編集します。

「PasswordAuthentication yes」を
    ↓
「PasswordAuthentication no」に書き換え。

081_1

(リモートホストの /etc/ssh/sshd_config ファイルを開いて編集の図。/etc/ssh/ssh_configと名前が似たファイルがあるので注意。この行はコメントアウトされている場合があるので、「#」も削除する。)

編集後は、

# systemctl restart sshd (または、$ sudo systemctl restart sshd )

とし、sshd を再起動。
これ以後、パスワード認証でのアクセスは不可となる。

 

 

【ローカルホストにて】   

【(3)openssh-client のインストール】 

# apt install openssh-client

openssh-client を導入します。ちなみに、Debian10 KDE では標準で入ってます。

 

 

【(4)秘密鍵・公開鍵の作成】 

$ ssh-keygen -t rsa

と入力すれば、rsa暗号での鍵生成がはじまります。

(※ ECDSAによる暗号での鍵生成をしたければ、「rsa」の代わりに「ecdsa」と入力すれば良いです。)

002_1_2

(上図:ローカルホストにて)
 
途中で
㋐「Enter file in which to save the key (/home/ユーザ名/.ssh/id_rsa):」
と、鍵をどこに保存するか聞かれます。

デフォルトでは「/home/ユーザ名/.ssh/」以下に作成されます。
場所はここで良いです。そのまま「Enter」キーを押せばOK。

次に
㋑「Enter passphrase (empty for no passphrase):」
と、パスフレーズを入力してくださいと聞かれます。
 
このパスフレーズは作成する「秘密鍵」にさらに「鍵をかける」合言葉のようなもの。
パスフレーズはかけないよりも、かけた方がよいです。
万が一「秘密鍵」が盗まれてしまった場合、パスフレーズをかけておけば、すぐに悪用はできないメリットがあります。これについては仕組みを知っていけばだんだんわかってくると思います。

フレーズを入力せずに「Enter」を打てば、パスフレーズ無し。
フレーズを入力してから「Enter」を打てば、パスフレーズ有り。
 
ちなみに、文字を入力しても「*****」のような表示は全くされません。まるで無反応のような感じですが、フレーズを打って、最後に「Enter」キーを押せばOKです。

一度入力したら、再度フレーズの入力確認を求められます。

以上で「秘密鍵/公開鍵」が生成されます。

003_1

 

【再びリモートホストにて】   

【(5)作成した公開鍵の登録】 

ローカルホストで作成した公開鍵をリモートホストに登録をします。

とりあえず手段は問わないので、ローカルホスト上に生成した公開鍵(今回の例では「id_rsa.pub」)をリモートホストへ持っていきます。

以下の図は、USBメモリを利用してリモートホストでアクセスしたいユーザ(つまり、ruser2ユーザ)のホームディレクトリにローカルホストの公開鍵をコピーした図です。

001_2

※1
大学や企業等のリモートホストに、自分(ローカルホスト)の公開鍵を渡す方法は、リモートホスト管理者のポリシーにより様々です。

「リモートホスト管理者(大学や組織の担当者など)にメールで公開鍵を送ってくれ」とか、「学内からリモートホストに直接アクセスして自分で公開鍵を登録してくれ」とか、「すでに対象のリモートホストにアクセス可能な人に公開鍵を登録してもらう」とか、いろいろです。

※2
この状況下では「ssh-copy-id」は使えないハズです。「パスワード認証不可設定」&「初認証」の場合、「ssh-copy-id」は使えないハズなので。逆に「ssh-copy-id」ができてしまうのであれば、「パスワード認証」が有効になっている可能性、つまり「パスワード認証」も絶賛受付中になっている可能性があります。(といっても、リモートホスト管理者でないと、これはどうしようも無いんですけどね・・・)

さて、上記の作業は公開鍵をリモートホストへ持ってきただけで、登録が済んだわけではありません。

この公開鍵の中身を「/home/ユーザ名/.ssh/authorized_keys」に追記します。
(以下はリモートホスト管理者、またはリモートホストにアクセス出来る人が行う。学内から自分でやれよ的に言われた人は自分でがんばりましょう。)

002_1_3

※ ここからのコマンド打ちは『ホームディレクトリに「公開鍵」がある(持ってきてある)』ことを前提にやってます。
 
※ 上図のように、cat コマンドを使って、

$ cat ./id_rsa.pub >> ./.ssh/authorized_keys

とやれば追記完了。
(「>>」については、「Linuxコマンド逆引き大全:リダイレクトの使い方」が参考になるかも。)
 
以上で終了です。

これで、SSH接続するための準備が整いました。
ちなみに、ホームディレクトリに放置してある公開鍵(id_rsa.pub)はもう不要なので削除して構いません。 

 

※1
「~/.ssh/authorized_keys」への「公開鍵」の追記は、上図のように

$ cat (持ってきた公開鍵) >> ~/.ssh/authorized_keys

とすれば良い。その際、「>>」とせずに「>」としてしまうと、追記では無く、書き換えになってしまうので注意。
万が一、他の公開鍵が「authorized_keys」にすでに記述されていた場合、すべて消えてしまうことになってしまう。間違えずに「>>」とすること

 

※2
上記コマンドを実行した際、「authorized_keys」が存在していれば「追記」、存在していなければ、「authorized_keys」が自動で新規作成される。「authorized_keys」が新規作成された場合、パーミッションが「rw-r--r--(644)」になっていると思われるので、

$ chmod 600 ./.ssh/authorized_keys

として、これを「rw-------(600)」に変更する。
003_1_2

※ パーミッションって何やねん、な方は「パーミッションについて」や「OSの種類で異なるパーミッションの考え方」が非常に参考になるかと。

 
※3
上記のコマンドを入力した際、「そのようなファイルやディレクトリはありません」と怒られることがある。「openssh-server」をインストールしたばかりのような運用したてのホストの場合、「.ssh」ディレクトリ、及び「authorized_keys」ファイルが存在していない可能性がある。特に「.ssh」ディレクトリが存在していない場合、上記のコマンドを実行すると、このように怒られるので注意。「.ssh」ディレクトリが無い場合は、ファイルマネージャでもコマンド使ってでも良いので「.ssd」ディレクトリを作成する。コマンドを使う場合は、

$ mkdir ./.ssh

とすれば作成される。
「.ssh」ディレクトリのパーミッションは「rwx------(700)」とした方が良さげ。

$ chmod 700 ./.ssh

とすれば変更できます。

  
ここまでくれば、sshの設定は終了です。

ちなみに、ここまでの作業が終了すれば、公開鍵認証によるSSH接続が可能になります。

(SSH接続については、「SSH でリモートアクセス! in 2018(その1)」を参考に。)

 

 

【② sshfsの設定・マウント 

【ローカルホストにて】   

【(11)sshfs のインストール】 

# apt install sshfs

sshfs を導入します。ちなみに、Debian10 KDE では標準で入ってます。

 

 

【(12)リモートホスト先をマウント】 

ローカルホストの端末から、

$ sshfs (リモートホストのユーザ名)@(リモートホストのIP):ディレクトリ マウントポイント
または、
$ sshfs (リモートホストのユーザ名)@(リモートホスト名):ディレクトリ マウントポイント

でマウントします。

Ss001_r

(ローカルホストの図。リモートホストの「worksディレクトリ」をローカルホストの「MPointディレクトリ」にマウント。)

これでマウント作業は終了です。

まるで、ローカルにファイルがあるような感覚で作業ができます。

 

【(13)アンマウント】 

fusermount -u マウントディレクトリ

でマウント解除になります。(終)

 

 

《おまけな話》

※1
個人でリモートホストを運用しているならば、【(5)作成した公開鍵の登録】を「ssh-copy-id」で登録してから【(2)パスワード認証の禁止化】をするのもひとつの手かなと思います。

※2
sshfsでマウントしたディレクトリ先をさらにgocryptfsで暗号化して取り扱うことも可能です。gocryptfs についての簡単な話は「Linuxでファイル暗号化(1)〜 USBメモリをgocryptfsで守る♪」を参考にしてください。

 

 

 

 

〔関連ページ〕
 ・SSH でリモートアクセス! in 2018(その1)  
 ・virt-manager でリモートアクセス(SSH-一般ユーザ接続:公開鍵認証)   
 
 
 

 

 

 

 

2018年8月24日 (金)

virt-manager でリモートアクセス(SSH-root接続:公開鍵認証)

 

※1
SSHのroot接続によるセキュリティ設定に不安がある方は
virt-manager でリモートアクセス(SSH-一般ユーザ接続:公開鍵認証)
の方が良いかと思います。
ちなみに手順的にはこちらの方が早いです。
 
※2
SSHの基本的な設定とかよくわからんな方は
SSH でリモートアクセス! in 2018
をどうぞ。

virt-manager でリモートアクセスです。 

とりあえずやり方は以下。
 
ちなみに今回の解説でのネットワークは以下のようなローカルな環境でやってます。
 
 
001

 
【ローカルホスト実行環境】

 ホストOS: Debian GNU/Linux 9
 仮想環境
  QEMU/KVM 2.8
  libvirt 3.0
  virt-manager 1.4
 ホスト名:LocalPC9 
 IP:192.168.11.2 
 ゲストOS
  ・debian7

 

【リモートホスト実行環境】

 ホストOS: Debian GNU/Linux 9
 仮想環境
  QEMU/KVM 2.8
  libvirt 3.0
  virt-manager 1.4
 SSHサーバopenssh-server 
 ホスト名:RemotePC9 
 IP:192.168.11.71 
 ゲストOS
  ・android8.1
  ・debian5
  ・debian9
  ・Raspbian
  ・winxp 

 

〔大まかな流れ:SSH設定手順〕 

【ローカルホスト側】
 ・公開鍵/秘密鍵ペア生成
 (他の環境で作成してもよい。その場合は、秘密鍵の設置を自身で。) 

【リモートホスト側】
 ・上記で作成された公開鍵を「/root/.ssh/authorized_keys」に。

で、終了。
 
002_3

 
ただし、自分の環境では、1回、通常のSSH接続してからでないと、virt-managerからリモートアクセスできなかった。
 

 

〔実践例〕 
 
(ローカルホストでの作業)

$ ssh-keygen -t rsa

で鍵を生成。ecdsaで行きたい人は「$ ssh-keygen -t ecdsa」。

 

012_1
 
(リモートホストでの作業)

(事前に上記で作成した「公開鍵」をruser2ユーザのホームディレクトリにコピーしたと仮定して)
# mkdir ./.ssh
# chmod 700 ./.ssh/
# cat /home/ruser2/公開鍵(*.pub)>> ./.ssh/authorized_keys
# chmod 600 ./.ssh/authorized_keys

で終了。 

 

021_1

(ローカルホストにて1回SSH接続しておく)
024_1

 


上記は「ssh root@ipアドレス」としているが、今回のようなローカルエリアネットな場合は、「ssh root@リモートホスト名.local(今回の例で言えば、 ssh root@RemotePC9.local で行ける)」(mDNS:Multicast DNS の使用。)

  

〔virt-manager でリモート接続〕 
ローカルホスト側の virt-manager を起動し、「ファイル > 接続を追加」を選択。
031_1

 
051_2

 
052_1

053_1

 (リモートで稼働してみたの図。)
 
 
さて、以上で終了ですが、冒頭で述べたとおり、「root接続」なので、個人的にはセキュリティ上心配があります。
 
この設定の場合、通常のSSH接続でも「root接続」が可なので、ローカルホストがセキュリティ的に陥落した場合リモートホストも無条件で落とされます
024_2

なので、このやり方でやる場合は、SSH接続に「何らかの制限」をかけた方が良いと思われます。
制限をかけないのであれば、このやり方で接続は「できる」けれども「やるべきではない」かも。
 
SSHの制限についてはいろいろと調べたんですが、素人な自分には良いやり方を見つけることができませんでした。う〜ん、残念。よい制限方法はないものか・・・。
 
  
  
ちなみに話変わって、virsh ならば、公開鍵内に

command="/usr/bin/virsh"

を追記すれば、SSH-root接続virsh に限定することは可能です。
 
(リモートホスト側)
061_1

(ローカルホスト側)
062_3

たぶんセキュリティ的にはマシかと。

 
 
 
 

〔関連ページ〕
 ・virt-manager でリモートアクセス(SSH-一般ユーザ接続:公開鍵認証)(非root接続) 
 ・SSH でリモートアクセス! in 2018(その2)【公開鍵認証】 
 ・virt-manager 超入門! in 2018   

 
 

【外部サイト】
 ・【 ssh 】コマンド――リモートマシンにログインしてコマンドを実行する 
 ・virt-managerでKVMホストにリモート接続する(VNCに関する情報が) 
 ・virshがroot以外で使えない理由 
 
 【TLS接続関係】
  ・libvirt:TLSSetup  
  ・KVMのリモート管理 
  ・libvirtでTLS接続 

 
 
 
 
 
  
 
 

2018年8月 6日 (月)

公開鍵認証:リモートホスト側の「秘密鍵/公開鍵」まわりのはなし

SSH でリモートアクセス! in 2018(その2)」の兄弟記事です。
 
(その2)では、ローカルホスト側の「秘密鍵/公開鍵」の話は出てきましたが、リモートホスト側の「秘密鍵/公開鍵」の話は出てこなかったので、今回はその話。
 
003_2_2

 

 


 【上図:SSH でリモートアクセス! in 2018(その2)より】 
 
以下、リモートホスト側の「秘密鍵/公開鍵」の動きについて自分が把握した範囲のものを書きますが、Debian9 上で調べたものになります。他のシステムでは多少違うかもしれないのであしからず。

 
 

〔リモートホスト側の鍵は、いつ、どこに作られるか?〕 

 

タイミング的には「openssh-server」インストール時に作られます。
 
002_1_4

 

 

 
で、どこに作られるかというと、

/etc/ssh/

のディレクトリに作られます。
 
011_1_2

 

 

 

ちなみに、

ssh-keygen -vlf (秘密鍵 or 公開鍵)

とすると、鍵の指紋を調べることができます。

 

021_

 

 

 
また、ついでに言うと、ペアの秘密鍵と公開鍵の指紋は一致します。

 
 
 

〔リモートホスト側の公開鍵が、ローカルホストに登録されるタイミング〕 

 

ローカルホストから、SSHでリモートホストに初めて接続した際、以下のように聞かれたと思います。

 

011_2_2

 

 


㋕ リモートホストのECDSA公開鍵のfingerprint(指紋)が「tEIJK・・・18+9g」なんだけど、
㋖ このリモートホストを信用して接続しますか?

 

と聞かれ、「yes」とすると、ローカルホスト側の「~/.ssh/known_hosts」にリモートホストの公開鍵が保存されます。
 
031_

 

 


 
003_3c2_2

 

 


 
2回目以降の接続は、

㋕ リモートホストのECDSA公開鍵のfingerprint(指紋)が「tEIJK・・・18+9g」なんだけど、
㋖ このリモートホストを信用してアクセスしますか?

は聞かれなくなります。(終)
 
 
 
 
 
 
【SSH関連ページ】
 ・SSH:rootでログインする場合 
 
 
 
【その他】
 ・量子コンピュータが暗号技術の安全性を脅かす?   
 ・中国最新鋭の量子暗号衛星「墨子」|シリーズ・21世紀のスプートニク・ショック(1) 

 
 
 
  

 
  
 
 
 
 
 
 

 

2018年8月 5日 (日)

SSH:rootでログインする場合

ネットでは「rootログイン拒否」のやり方はいくらでも出てくるんですが、「許可」のやり方はなかなか見つけられず。まぁ、セキュリティ上はよろしくないですからね。ただ、逆を知ることも大切なので、いろいろいじって調べてみた。

ちなみに作業環境はDebian9。
以下、リモートホスト側(openssh-server がインストールされている側)で設定を行う。

 

〔パスワード認証:rootログイン許可〕 

次の2つの設定が必要。
 ・PermitRootLogin yes (rootログインの許可)
 ・PasswordAuthentication yes (パスワード認証を許可)

「PermitRootLogin prohibit-password」の場合、「Permission denied, please try again.」と何度も弾かれ、結局ログインできない。
 
 

〔公開鍵認証:rootログイン許可〕 

次の2つの設定が必要。
 ・/root/.ssh/authorized_keys に公開鍵を登録
 ・PermitRootLogin prohibit-password(rootのパスワード認証は弾くが、公開鍵認証は有効)
 (PermitRootLogin yes でも良いが、こちらはパスワード認証を弾かないので上の方が良い)
 
以下は(推奨項目)任意。
 ・PasswordAuthentication yes (パスワード認証を許可。ただし、rootのみは「PermitRootLogin prohibit-password」の方で、パスワード認証は弾かれる)
 ・PasswordAuthentication no (パスワード認証を拒否。一般ユーザ含めてすべて。)
 
 
 

 

★「/etc/ssh/sshd_config」設定ファイルでの関連する項目★

●PermitRootLogin
 
rootログインの禁止

PermitRootLogin no

 

rootログインの許可

PermitRootLogin yes

 

rootログインにおいて、すべてのインタラクティブな認証を禁止し、公開鍵もしくはホストベース、GSSAPIによる認証のみが有効

PermitRootLogin prohibit-password

(OpenSSH7.0 からこちらがデフォルトらしい)


 

●PasswordAuthentication

パスワード認証を拒否する

PasswordAuthentication no

 

パスワード認証を許可する(デフォルト)

PasswordAuthentication yes

 
 

 
 
【外部サイト】
 ・「OpenSSH 7.0」がリリース、PermitRootLogin設定の変更などセキュリティ強化が行われる 
 ・sshでのrootログインを禁止しssh経由でのroot権限では指定のコマンドだけを実行できるようにする方法 
 ・そこそこセキュアなlinuxサーバーを作る 
 ・SSHサーバセキュリティ設定ガイド(日本シーサート協議会)」 
 ・ikemo memo:マニュアル: sshd:PermitRootLogin(forced-commands-only の比較など分かりやすい) 
   
 
 
 
 
 

〔関連ページ〕
 ・virt-manager でリモートアクセス(SSH-root接続:公開鍵認証) 
 ・SSH でリモートアクセス! in 2018(その1) 

 

 


 
 

 

 

 

2018年8月 4日 (土)

SSH でリモートアクセス! in 2018(その1)

使えるとすごく便利なSSH。
たまたまSSHを使わざるを得なくなったので、ネットを放浪しながら多少なりとも使えるようになったのですが、ここまで来るのに一苦労。

とりあえず、基本的な設定や使い方を整理したものをまとめておこうかと。
Linuxで説明してますが、公開鍵の配置関係などはWindowsユーザも参考になるかと思います。

ということで、今回のお題は、

〔SSH でリモートアクセス! in 2018 〕 

であります。
 
 

そもそも「SSH」って何だ? 

SSH(Secure Shell)は、暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコル。
具体的には、

・コンピュータ間のネットワークの暗号化による盗聴のリスクの排除
・接続先のリモートホストの正当性のチェック
・リモートホストに接続してくるユーザの正当性のチェック

などを実現するための仕組みだと思えばよいかと思います。
で、それを実現するためのプログラムが「OpenSSH」や「SSH Tectia」などです。
ちなみに、OpenSSHは世界で最も使用されているSSH実装の模様。
ということで、OpenSSHを使ってSSHリモートアクセスを試みます。

さて、SSHでリモートアクセスする際、「認証」という作業が必要となります。
 
で、OpenSSHで利用できる認証はいくつかあるのですが、ここでは「パスワード認証」と「公開鍵認証」の2つを取り上げることとします。

 

〔パスワード認証によるSSH接続〕 
 
「パスワード認証」は超お手軽です。
ただし、世間的には推奨されてません。
また、リモートホストによっては、「パスワード認証」が利用できない設定になっている場合もあります。
 
ただ、後の「公開鍵認証」の話を理解しやすくするためにも、説明は無駄では無いかと。
ということで、実践してみます。
 

〔ローカルホスト側の準備〕
ローカルホスト側で必要なものは以下です。

・sshクライアント
・リモートアクセス先の「アカウント(ユーザ)名」とその「パスワード」

例えば、以下のようなケースの場合、
 
012_3  
 
ユーザ名「ruser2」と、そのパスワード「YYY」が必要。
 
ちなみに、この例でのローカルホストのOSはDebian9なので、sshクライアントはすでに入っている状態です。
(Debian9の場合は標準的なインストールの仕方をすればデフォルトで入っていると思います。)
 
 
  

〔リモートホスト側の準備〕 
リモートホスト側で必要なものは、

・sshサーバ

のみです。

Debian9 の場合、OSのインストールの仕方によってはsshサーバが入っている場合がありますが、入っていない方が多いかと。

もしsshサーバが入っていなければ、Debian系の場合は

# apt install openssh-server

でインストールすればok。(これはリモートホスト管理者が行います。)
 
001_1
 
これで準備終了。
では、SSH接続してみましょう。
 
 
 
〔パスワード認証によるsshアクセス〕
ローカルホスト側で、

$ ssh リモートホストのユーザ名@IPアドレス 

とすればOK。
(または、$ ssh リモートホストのユーザ名@ホスト名

今回の例で言うと、

$ ssh ruser2@192.168.11.71

とすれば良い。
001_1_2

(上図:ローカルホストにて)
 
初回アクセス時には
 ㋐ Are you sure you want to continue connecting ?
と聞かれます。
 
とりあえずアクセスするので、
「yes」と入力します。ちなみに「y」の省略形ではダメです。
 
すると以下のようになります。
 
002_1

㋑ リモートホスト先の ruser2 のパスワードの入力を求められます。
このパスワードは暗号化された状態でリモートホストに送られます。
 
ここで、パスワードを入力すればSSH接続開始です。
 
003_1
(上図:ローカルホストにて)
 
接続を終了するには「exit」とすれば良いです。
 
004_
(上図:ローカルホストにて)
 
 以上で、「パスワード認証」によるSSH接続は終了です。
 
 
 
 
〔「パスワード認証」が推奨されない理由は何だろう?〕 
 
ということで、「パスワード認証」によるSSH接続は非常に手軽にできるわけですが、何で推奨されないか、ということなんですよね。
 
022__2
 
ようは第三者に何らかの方法で「ユーザ名」と「パスワード」に知られてしまうと、簡単に自由にアクセスされてしまうことが原因なんだと思います。
 
023_
 
ジョーアカウント」ならユーザ名を知られた時点で一発でアウト。
シンプルなパスワードなら、「ブルートフォースアタック」でやられる可能性もあります。また、パスワードのメモを落としたとか、リモートホスト先のパスを書いた付箋を見られたといった古典的な形で知られたり、成りすましホストに誘導されて、「パスワード認証」でSSH接続を試した時に「ユーザ名/パスワード」が取られたりといったこともありえます。
 
024
 
ということで、管理者が「パスワード認証」を嫌って、リモートホスト側で「パスワード認証」では接続が出来ないようにしている場合もあります。 
 
ちなみに、「パスワード認証」を不可とする場合は、以下の手順でやると良いです。
 
【パスワード認証の禁止化】

【リモートホスト側にて】
 ① /etc/ssh/sshd_config ファイルにて
  「PasswordAuthentication yes」を
  「PasswordAuthentication no」と編集後、
 ② # systemctl restart sshd でsshd を再起動。 

とすれば「パスワード認証」はできなくなります。
 
081_1  
(リモートホストの /etc/ssh/sshd_config ファイルを開いて編集している所。/etc/ssh/ssh_configと名前が似たファイルがあるので注意。Debian9の場合、この行はコメントアウトされているので、「#」も削除する。)
 
082_1_2
(リモートホストにて「sshd(sshサーバ)」を再起動。systemdで無いシステムの場合は、違うコマンドになるかも。)
 
以上で、ローカルホストから「パスワード認証」で接続できなくなります。
 
086_1
(上図:ローカルホストにて)

さて、長々と「パスワード認証」について話をしてきましたが、「パスワード認証」におけるリスクを避ける方法として「公開鍵認証」があるわけです。
 
 
B063_001r

 
ということで、「SSH でリモートアクセス! in 2018(その2)」に続きます。
 
 
 
 
 
 

SSH でリモートアクセス! in 2018(その2)

SSH でリモートアクセス! in 2018(その1)」の続きです。
 
今回は「公開鍵認証」におけるSSHリモートアクセスについて解説します。
「パスワード認証」に関しては(その1)を参照してください。
 
 
 
〔公開鍵認証によるSSH接続〕
 
以下の知識はあるものとします。

・「公開鍵」と「秘密鍵」の違いについて
・基礎的なコマンドライン操作知識
・IPアドレスの基本的な知識
・DHCPについて

 

〔仮のネットワーク構成図〕 

以下のような環境を想定して説明します。
 
002

 

上図では、「自分のPC」が「ローカルホスト」。
「アクセスしたい先」が「リモートホスト」。
もちろん、アクセスしたい先のシステムにはSSHの設定がなされていることとします。

 
 

〔何を行えば、公開鍵認証ができるのか?〕
単純に説明すると、

① 自分で「秘密鍵&公開鍵ペア」を作成し、秘密鍵はしかる場所へ配置。
(秘密鍵の配置場所において、鍵作成時によけいなことをしなければ、デフォルトでしかる場所へ配置されるので、これについてはあまり考えなくて良い。ちなみに、公開鍵も同じ場所に作成される。)
② ローカルホストの「公開鍵」のみを、リモートホストのしかるべきところに配置登録(コピー)

すれば、SSH接続できるようになります。
 
003_8a_2

では実践してみます。

 

〔ローカルホスト側の準備〕

まずローカルホストのPCにて、「秘密鍵/公開鍵」を作成します。
ちなみにローカルホストのPC環境は以下でやってます。

ホスト名:LocalPC9
ユーザ名:luser1
IPアドレス:192.168.11.2 / 24
OS:Debian GNU/Linux 9 KDE

 

【① 秘密鍵/公開鍵の生成】 
Debian9では「openssh-client」がデフォで入っているので、鍵の生成はすぐできます。
ローカルホストの端末で、

$ ssh-keygen -t rsa

と入力すれば、rsa暗号での鍵生成がはじまります。
 
(※1 上記の「$」は入力しない。「$」は一般ユーザの意。何のこっちゃの方は「Linuxのシェルとコマンドプロンプトを理解しよう」が参考になるかと。)
(※2 ECDSAによる暗号での鍵生成をしたければ、「rsa」の代わりに「ecdsa」と入力すれば良いです。)
 
002_1_2

(上図:ローカルホストにて)
 
途中で
㋐「Enter file in which to save the key (/home/ユーザ名/.ssh/id_rsa):」
と、鍵をどこに保存するか聞かれます。

デフォルトでは「/home/ユーザ名/.ssh/」以下に作成されます。
場所はここで良いです。そのまま「Enter」キーを押せばOK。

次に
㋑「Enter passphrase (empty for no passphrase):」
と、パスフレーズを入力してくださいと聞かれます。
 
このパスフレーズは作成する「秘密鍵」にさらに「鍵をかける」合言葉のようなもの。
パスフレーズはかけないよりも、かけた方がよいです。
万が一「秘密鍵」が盗まれてしまった場合、パスフレーズをかけておけば、すぐに悪用はできないメリットがあります。これについては仕組みを知っていけばだんだんわかってくると思います。

フレーズを入力せずに「Enter」を打てば、パスフレーズ無し。
フレーズを入力してから「Enter」を打てば、パスフレーズ有り。
 
ちなみに、文字を入力しても「*****」のような表示は全くされません。まるで無反応のような感じですが、フレーズを打って、最後に「Enter」キーを押せばOKです。

一度入力したら、再度フレーズの入力確認を求められます。

以上で「秘密鍵/公開鍵」が生成されます。
 
003_1

 

ちなみに、公開鍵の中身は以下な感じ。
 
004_1

 鍵の中身はただの文字列です。
 
 
 
〔リモートホスト側の準備〕 
 
192.168.11.71のリモートホストの環境は以下でやってます。

ホスト名:RemotePC9
ユーザ名:ruser2
IPアドレス:192.168.11.71 / 24
OS:Debian GNU/Linux 9 KDE

 

リモートホスト側で必要なものは

SSHサーバ

のみです。
これはリモートホスト管理者が準備します。

自宅内にリモートホストを設置する場合は、当然ながら自分でやります。

自分でやる場合は、SSHサーバの導入が必要なので、以下のような感じでインストールします。(debian系の場合)

# apt install openssh-server

(apt でのインストールが「?」な方は「apt-get チュートリアル」を参考に)

001_1

(上図:リモートホストにて)
 
 
 
【② 公開鍵をリモートホストに登録】 

192.168.11.71 のリモートホストにて作業した例です。

とりあえず手段は問わないので、ローカルホスト上に生成した公開鍵(今回の例では「id_rsa.pub」)をリモートホストへ持っていきます。

以下の図は、USBメモリを利用してリモートホストでアクセスしたいユーザ(つまり、ruser2ユーザ)のホームディレクトリにローカルホストの公開鍵をコピーした図です。

001_2


大学や企業等のリモートホストに、自分(ローカルホスト)の公開鍵を渡す方法は、リモートホスト管理者のポリシーにより様々です。

「リモートホスト管理者(大学や組織の担当者など)にメールで公開鍵を送ってくれ」とか、「学内からリモートホストに直接アクセスして自分で公開鍵を登録してくれ」とか、「すでに対象のリモートホストにアクセス可能な人に公開鍵を登録してもらう」とか、いろいろです。

さて、上記の作業は公開鍵をリモートホストへ持ってきただけで、登録が済んだわけではありません。

この公開鍵の中身を「/home/ユーザ名/.ssh/authorized_keys」に追記します。
(以下はリモートホスト管理者、またはリモートホストにアクセス出来る人が行う。学内から自分でやれよ的に言われた人は自分でがんばりましょう。)

002_1_3  
※ ここからのコマンド打ちは『ホームディレクトリに「公開鍵」がある(持ってきてある)』ことを前提にやってます。
 
※ 上図のように、cat コマンドを使って、

$ cat ./id_rsa.pub >> ./.ssh/authorized_keys

とやれば追記完了。
(「>>」については、「Linuxコマンド逆引き大全:リダイレクトの使い方」が参考になるかも。)
 
ちなみに、鍵の中身は単なるテキストなので、エディタを使っての追記も一応可能。

 
以上で終了です。
これで、SSH接続するための準備が整いました。
ちなみに、ホームディレクトリに放置してある公開鍵(id_rsa.pub)はもう不要なので削除して構いません。
 

※1
「~/.ssh/authorized_keys」への「公開鍵」の追記は、上図のように

$ cat (持ってきた公開鍵) >> ~/.ssh/authorized_keys

とすれば良い。その際、「>>」とせずに「>」としてしまうと、追記では無く、書き換えになってしまうので注意。
万が一、他の公開鍵が「authorized_keys」にすでに記述されていた場合、すべて消えてしまうことになってしまう。間違えずに「>>」とすること

 
※2
上記コマンドを実行した際、「authorized_keys」が存在していれば「追記」、存在していなければ、「authorized_keys」が自動で新規作成される。「authorized_keys」が新規作成された場合、パーミッションが「rw-r--r--(644)」になっていると思われるので、

$ chmod 600 ./.ssh/authorized_keys

として、これを「rw-------(600)」に変更する。
003_1_2

※ パーミッションって何やねん、な方は「パーミッションについて」や「OSの種類で異なるパーミッションの考え方」が非常に参考になるかと。

 
※3
上記のコマンドを入力した際、「そのようなファイルやディレクトリはありません」と怒られることがある。「openssh-server」をインストールしたばかりのような運用したてのホストの場合、「.ssh」ディレクトリ、及び「authorized_keys」ファイルが存在していない可能性がある。特に「.ssh」ディレクトリが存在していない場合、上記のコマンドを実行すると、このように怒られるので注意。「.ssh」ディレクトリが無い場合は、ファイルマネージャでもコマンド使ってでも良いので「.ssd」ディレクトリを作成する。コマンドを使う場合は、

$ mkdir ./.ssh

とすれば作成される。
「.ssh」ディレクトリのパーミッションは「rwx------(700)」とした方が良さげ。

$ chmod 700 ./.ssh

とすれば変更できます。

  
では、実際にSSH接続をしてみます。
 
 
 
〔公開鍵認証によるSSHアクセス〕
 
ローカルホストの端末から、

$ ssh (リモートホストのユーザ名)@(リモートホストのIP)
または、
$ ssh (リモートホストのユーザ名)@(リモートホスト名)

でアクセスします。

011_2

(上図:ローカルホストにて)

初回アクセス時には、
㋕ リモートホストのECDSA公開鍵のfingerprint(指紋)が「tEIJK・・・18+9g」なんだけど、
㋖ このリモートホストを信用して接続しますか?
と聞いてきます。

とりあえず、信用して「yes」としましょう。
不安があるなら、リモートホスト管理者にこの指紋で間違ってないか、問い合わせてください。

012_1

パスフレーズを登録した場合、
 ㋗ パスフレーズを入力してください
と出ます。

パスフレーズを入力すれば、SSH接続がはじまります。

SSH接続を終了したい場合は、「exit」と入力してください。

013_1

上記を見るとわかりますが、「公開鍵認証」ではユーザのパスワードを入力することはありません。ここが「パスワード認証」と違うところですね。
 
以上で「公開鍵認証によるSSH接続」は終了になります。お疲れ様でした。

 

簡単なまとめ

(1) ローカルホストにて「ssh-keygen」で「秘密鍵/公開鍵」ペアを作成
(2) 公開鍵(の中身)をリモートホスト先ユーザの「authorized_keys」に追記 
(3) SSH接続開始♪

 
 

《おまけな話》

※1
「鍵の作成」は別に「接続に使うPC」でなくても良い。
例えば他のシステムで作成した鍵を持ってきても可能。
 
003_5
 
また、違うPCに秘密鍵を突っ込んで、そのPCからアクセスすることも可能。
これについての実践は『セカンドPCに秘密鍵を突っ込んでSSH接続』を参考に。
 
 
 
※2
「ssh-copy-id」は便利だけれど・・・
やっぱりリモートホストの「ユーザ名」と「パスワード」がわかってしまうとセキュリティ的には「パスワード認証」のリスクと似た部分が出てくるんですよね。
 
ちなみに「SSH でリモートアクセス! in 2018(その1)」で述べた【パスワード認証の禁止化】をすれば、「ssh-copy-id」でパスワードにての鍵交換はできなくなります。
 
 
※3
リモートホスト側のもう少し突っ込んだ話について。
公開鍵認証:リモートホスト側の「秘密鍵/公開鍵」まわりのはなし
興味のある方はどうぞ。
  

 

※4
SSHプロトコルを利用してネットワークごしにファイルシステムをマウントすることのできる「SSHFS」について。
パスワード認証禁止 & 公開鍵認証でsshfsを使う」という記事があります。
興味がある方はどうぞ。

 

 
 
SSHサーバのセキュリティについては、
SSHサーバセキュリティ設定ガイド(日本シーサート協議会)」が公開されています。
管理者となる人は参考にすると良いかもしれません。
 
 
 
 
 
【外部サイト】
 ・SSHのポート番号が「22」に決まった経緯を開発者のTatu Ylonen氏が公開 
 ・sshのポートをデフォルトの22/tcpから変えるべきか論争に、終止符を打ちました 
 ・SSH接続を高速化する4つの方法 
 ・ssh ポート転送 
 ・SSHポートフォワード(トンネリング)を使って、遠隔地からLAN内のコンピュータにログインする 
 ・ssh-keygenによって生成されたrandomartとは何ですか? 
 
 ・暗号と署名の話 
 ・公開鍵暗号と署名方式の誤り解説 
 ・2つの公開鍵暗号(公開鍵暗号の基礎知識)
 ・SSHの公開鍵認証における良くある誤解の話   
 ・Diffie-Hellman鍵交換入門 
  
 <その他>
 ・量子コンピュータが暗号技術の安全性を脅かす?   
 ・中国最新鋭の量子暗号衛星「墨子」|シリーズ・21世紀のスプートニク・ショック(1) 

 

 

〔関連ページ〕
 ・それは誰が保証するか?〔GnuPG(GPG)/電子署名〕〜ごまかせない署名〜  

 

 

 

 

 

 

 
 

2018年8月 2日 (木)

セカンドPCに秘密鍵を突っ込んでSSH接続(公開鍵認証)

 
003_6
Debian9での例です。
公開鍵認証によるSSH接続は「秘密鍵」さえあれば可能。
手順としては、

① 「/home/ユーザ名/.ssh/」ディレクトリに「秘密鍵」をコピー
②  秘密鍵のパーミッションを「600」に変更 (終)

「./ssh」ディレクトリが無い場合は自分で作成。
その際、このディレクトリのパーミッションは「700」。

ということで、セカンドPCに「秘密鍵」を突っ込んでSSH接続してみた例です。

065_1  
 【上図:セカンドPC(Debian9 KDE)にて】
 
 
ちなみに「秘密鍵」のパーミッションは「600」としないとアクセスできないのでご注意を。
 
066_
 
 
これを見てわかる通り、「秘密鍵」は絶対に流出させてはいけないことが良くわかると思います。
 
ちなみにパスフレーズをかけておけば、第三者が「秘密鍵」を使おうと思っても、パスフレーズを知らない限り使えないです。
 
ここにパスフレーズをかける意味があります。
 
ただし「秘密鍵」が奪われた後に、パスフレーズの解析を受けるリスクもあることは知っておいてください。
 
何はともあれ「秘密鍵」の管理はしっかりと行いましょう。
 
 
 
 
【おまけ】
「秘密鍵」が複数ある場合、明示的に秘密鍵を指定したい場合は、以下のようにします。

$ ssh -i (指定の秘密鍵) (リモートホストのユーザ名)@(リモートホストのIP)
または、
$ ssh  -i (指定の秘密鍵) (リモートホストのユーザ名)@(リモートホスト名)

062_

ちなみに「~/.ssh/config」を活用すると更に細かく「秘密鍵」を管理運用できるようです。
 
興味がある方は調べてみてください。
 
 
 
 
〔SSH関連記事〕
 ・SSH でリモートアクセス! in 2018(その1)【パスワード認証】 
 ・SSH でリモートアクセス! in 2018(その2)【公開鍵認証】 
 
 
 
 
 
 
 
 
 

2021年5月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
無料ブログはココログ