質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.38%
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Q&A

解決済

4回答

4190閲覧

SSHのパスフレーズに関して

unser

総合スコア58

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

0グッド

1クリップ

投稿2021/04/15 03:47

sshにて鍵を作る際にpassphaseを設定する方も多いと思います.

$ ssh-keygen -yf ~/.ssh/himitsukagi

とすると公開鍵を取得するためにpassphaseを要求されます.
しかし,catで直接
$ cat himitsukagi.pub

とすると,passphaseを要求されることなく公開鍵を入手できます.

正直これが公開鍵であるため入手されても問題ないと思うのと同時に,catで簡単に突破されてしまう気がするのですがSSHのパスフレーズはどのような場面で有効になるのでしょうか.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

$ ssh-keygen -yf ~/.ssh/himitsukagi

とすると公開鍵を取得するためにpassphaseを要求されます.

これは「昔はパスフレーズが必要だった為、その頃の作りを引きずっている」というのが答になると思います。

OpenSSHで主に使われる秘密鍵は

  • PEM形式
  • OpenSSH形式

の二種類が有ります。

まずPEM形式ですが、OpenSSHでは比較的昔のバージョンで使われていた形式です。
この形式では鍵全体が暗号化されています。公開鍵を取り出す時はいったん復号する必要が有る為、パスフレーズが必要になります。
ただ、公開鍵を取り出す時に毎回パスフレーズが必要になるのは不便なので、秘密鍵とは別のファイルに暗号化されていない状態で公開鍵を保存しておき、公開鍵だけが必要な時はそのファイルから読み込むようになりました。これがid_rsa.pub等の公開鍵ファイルです。

次にOpenSSH形式ですが、これは比較的新しいバージョンのOpenSSHで利用されている秘密鍵ファイルです。
この形式はPEM形式に比べて色々と改良されているのですが、その改良点の一つに「公開鍵部分は暗号化せずに平文のまま保存する」というのが有ります。
なのでOpenSSH形式の秘密鍵から公開鍵を取り出す時はパスフレーズは必要無いのですが、ssh-keygenコマンドはPEM形式しか無かった頃の作りをひきずっていて、「とりあえずパスフレーズを入力させて、秘密鍵ファイルがOpenSSH形式だった場合はパスフレーズを使わない」という動作になっています。
ただ、sshコマンドも昔は同様に秘密鍵ファイルから公開鍵を取り出す時にパスフレーズを要求していたのですが、最近のバージョンではOpenSSH形式の場合はパスフレーズ無しで取り出すように変わったので、ssh-keygenコマンドでも将来的にはパスフレーズが必要なくなるかもしれません。

おまけ

OpenSSH形式の秘密鍵ファイルからパスフレーズ無しで公開鍵を取り出すrubyスクリプトです。
別用途で作ったスクリプトを利用してでっち上げたので、エラー処理等はいい加減です。
出力にコメント部分が無いのは、コメントは暗号化されていてパスフレーズ無しでは読めないからです。
……もしかしてssh-keygen -yでパスフレーズが必要なのはこのコメントの扱いの問題なのかも。

ruby

1class String 2 def get_uint32! 3 self.slice!(0,4).unpack1("N") 4 end 5 6 def get_string! 7 len = get_uint32! 8 self.slice!(0, len) 9 end 10 11 def get_mpint! 12 len = get_uint32! 13 self.slice!(0, len).unpack("C*").inject do |r, v| (r << 8) + v end 14 end 15end 16 17KEY_START = "-----BEGIN OPENSSH PRIVATE KEY-----" 18KEY_END = "-----END OPENSSH PRIVATE KEY-----" 19AUTH_MAGIC = "openssh-key-v1\0" 20 21b64key = "" 22state = :init 23 24while gets 25 if $_.chomp == KEY_START 26 state = :key_start 27 break 28 end 29end 30 31if state != :key_start 32 STDERR.puts "No begin line" 33 exit 1 34end 35 36while gets 37 $_.chomp! 38 if $_ == KEY_END 39 state = :key_end 40 break 41 end 42 43 b64key << $_ 44end 45 46if state != :key_end 47 STDERR.puts "No end line" 48end 49 50data = b64key.unpack1("m") 51 52if data.slice!(0, AUTH_MAGIC.size) != AUTH_MAGIC 53 STDERR.puts "Invalid key data" 54 exit 1 55end 56 57cipher = data.get_string! 58kdfname = data.get_string! 59kdfopt = data.get_string! 60 61numofkeys = data.get_uint32! 62 63STDERR.puts "keys: #{numofkeys}" 64 65numofkeys.times do |i| 66 pubkey = data.get_string! 67 keytype = pubkey.dup.get_string! 68 puts "#{keytype} #{[pubkey].pack("m").gsub(/\n/, "")} " 69end

投稿2021/04/15 16:37

doda

総合スコア947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SSHのパスフレーズはどのような場面で有効になるのでしょうか.

パスフレーズは「秘密鍵」の保護用です。公開鍵には無関係です。

$ ssh-keygen -yf ~/.ssh/himitsukagi
とすると公開鍵を取得するためにpassphaseを要求されます.

本来、鍵生成時に秘密鍵ファイル(公開鍵情報も同梱)・公開鍵ファイルはペアで作られて「作成者は両方所有して使うもの」です。なので、ssh-keygen -y でパスフレーズが必要なことはあまり考えてもしようがないです。
※今後は -y の時のパスフレーズは不要になるかも知れませんが ( フォーマット的にはそうなってきているため )

投稿2021/04/15 03:57

angel_p_57

総合スコア1681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

公開鍵は、「これが公開鍵であるため入手されても問題ない」という認識で良いと思います。

SSHのパスフレーズはどのような場面で有効になるのでしょうか.

鍵ペアをパスフレーズを指定して作成した場合、秘密鍵は暗号化されて保存されます。
パスフレーズを指定しても公開鍵のほうは暗号化されずに保存されます。
パスフレーズは、秘密鍵の復号化をするために必要になります。

投稿2021/04/15 03:53

編集2021/04/15 04:05
hidezzz

総合スコア1248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

パスフレーズってのは鍵につくもんなんで、鍵の入手に関わるもんじゃありません

#そもそもcatのコマンドってなにするもんか調べましょう

投稿2021/04/15 03:55

y_waiwai

総合スコア88000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.38%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問