PanicアプリでSSH鍵を使用する

実際問題: パスワードはキケンです。セキュアと言われる複雑なパスワードは覚えられず、それでも尚、簡単に破られます。数字や記号、大文字や小文字を混ぜた長いパスワードをサービスごとに準備することはとても大変で、さらに、それらを定期的に変更するのは途方もない労力です。

Use Keys, Not Passwords

幸いにも人類には認証鍵を使用したSSH接続を利用することができます。鍵認証はシンプルなユーザ名とパスワードと比べ、莫大な進歩を遂げた認証方法です。

鍵認証ではパスワードの代わりに鍵のペアが一致するかで認証されます: 公開鍵秘密鍵です。誰もが公開鍵を使用して情報を暗号化でき、しかしアクセスし暗号化を解除するにはペアとなっている秘密鍵が必要となります。秘密鍵で認証することで、公開鍵を持つ任意のサーバーに接続できます。


鍵認証を行う前に

鍵認証を行う前に、下記について確認しましょう。

サーバから認証鍵が提供されてる場合
素晴らしい!次のステップに進みましょう。
認証鍵の提供が無い場合
心配ありません。アプリケーションから鍵を生成することが可能です。

鍵のペアを生成する

お使いのアプリケーションが Transmit 5 か Nova もしくは Prompt 3 の場合、鍵の生成機能が搭載されています。Macアプリでは環境設定 > 認証鍵を開き、+ ボタンを押して鍵を生成します。Prompt 3 for iOS および iPadOSでは設定のギアアイコンをタップし、認証鍵 > 新規認証鍵 > 認証鍵の生成を選択します。

Generating a key in Transmit 5.

コマンドラインを使用する

Macでは認証鍵の生成をコマンドラインを利用して行うことも可能です。Ed25519 鍵を生成するにはターミナル.appを起動し、以下のコマンドを入力します:

$ ssh-keygen -t ed25519

シンボル$はコマンドプロンプトのインジケータです $の後の文字列をコマンドとして入力してください。

入力した後Returnキーを押すと以下が表示されます:

Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/YOU/.ssh/id_ed25519):

1行目は鍵の作成先で、2行目は鍵の名前です。ここでは、デフォルトのままで進めます。

Returnキーを押すと、id_rsa という名前の鍵ファイルがホームフォルダの .ssh フォルダに作成されます。

より詳しく! macOSのFinder.ssh フォルダを不可視フォルダとして扱います。.ssh フォルダをFinderで表示するには、ショートカットCommand+Shift+Gの入力後、~/.sshと入力してください。さらに! チルダ (~) はユーザホームフォルダの省略記号です。つまり、~/.ssh/Users/YOU/.sshを現しています。

続いて、秘密鍵をパスフレーズで保護するかどうかを設定します。

パスフレーズは秘密鍵のセキュリティを一層高めます。より高いセキュリティを必要とする場合は利用します。

Enter passphrase (empty for no passphrase):

パスフレーズを設定する場合は入力します。

設定しない場合は何も入力せず、ただReturnキーを押します。

Enter same passphrase again:

確認のため、再入力します。設定しない場合はそのまま、設定する場合はそのパスフレーズを再入力しReturnキーを押します。

Your identification has been saved in /Users/YOU/.ssh/id_ed25519.
Your public key has been saved in /Users/YOU/.ssh/id_ed25519.pub.

The key fingerprint is:
SHA256:eq3mdT4LjwYw+fTphcCEgdTVJV+fn3e/mNHwAlX+szY YOU@YourMac.local
The key's randomart image is:
+--[ED25519 256]--+
|   ..o.+..... .. |
|    . o . .o .o..|
|       +    .. o.|
|      + +   .   +|
|       =So + . o=|
|       .o.+ o + *|
|      . .o+..o E.|
|       ..oo*. * o|
|       oo.. += . |
+----[SHA256]-----+

以上で鍵のペアが生成されました。

秘密鍵"id_ed25519“と公開鍵”id_ed25519.pub“が、ホームフォルダ内の”.ssh“フォルダに保存されます。

公開鍵

公開鍵 (拡張子.pub) はリモートサーバに設置します。システム管理者から鍵ファイルを渡された場合、必要な作業は既に完了しているかも知れません。逆にそうでない場合、公開鍵をサーバの然るべき場所に設置する必要があります。

公開鍵は1行の長い文字列です。以下のコマンドで参照することができます:

$ cat ~/.ssh/id_ed25519.pub

以下のように表示されます:

ssh-ed25519 AAAA75e8wZ/YTf3T8xz/gqnmTkKFMkCUBHMahpqHY7VdprMJqYVhu//v1OyNkSFfZ/jh/WLE+d3mIXUsRD1nBZDhkoKqdAuCt2Bw+Jy6fZnDfBpDv8uzYvuiGh5f9XT+0jVdj8aaqe09/C5yEwW2P2g2XZ4XqvT4NzaC1yc2EAAAADAQABAAABAQDLWN2v57PUNZsQsUUdRHYth6DO YOU@YourMac.local

注意: 上記は例で、実際の公開鍵ではありません。

秘密鍵

秘密鍵は文字通り、秘密にしておく必要があります。ホームフォルダ内の.sshフォルダに設置しておくのが良いでしょう。公開鍵と同じように、下記のコマンドで内容を表示すること可能です:

$ cat ~/.ssh/id_ed25519

すると以下のように表示されます:

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAHAABG5vbmUAAAAEbm9uZQAABABARAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACAY0A5QKLf5QF3lyFV2n4YhQbOU3Bi47Niq6ywQQq9JwwAAAKAvMAdwLzAH
cAB8PAtzc2gtZWQyNTUxOQAAACAY0A5QKLf5QF3lyfji8WDhQbOU3Bi39Niq6ywQQq9Jww
AAAEDA7K3OkvyR0Wi4UukwRXrsCd2jJLRVW7Kosx2GGdLOuxjQDlAot/lAXeXIVXafhiFB
s5TcGLjs2KrrLBBCr0nDAAAAGW1oe4RdaXFlrZXMtV29yay1NQkEubG9jYWwBAgME
-----END OPENSSH PRIVATE KEY-----

注意: こちらも上記は例で、実際の秘密鍵ではありません。

~/.ssh/configファイル

公開鍵と秘密鍵とは別に、.sshフォルダ内にconfigという名前のファイルが存在しているかも知れません。このファイルはサーバアドレスと使用する鍵ファイルを関連付けるなど、多くのオプションを使用するアプリケーションに提供することが可能です。

存在しない場合、configという名前のファイルを追加することで追加可能です。

便利なconfigファイルの使用方法として、サーバexample.comにログインユーザuserが、鍵ファイルexampleKeyを使用してログインする例を以下に紹介します:

Host example.com
  User user
  IdentityFile "~/.ssh/exampleKey"

もしデフォルト以外の名前を鍵ファイルに使用したい場合や鍵ファイルを~/.sshフォルダ以外に設置したい場合、パスフレーズで保護された秘密鍵をCodaやTransmitで使用したい場合などでconfigファイルを準備すると便利です。

configファイルの取り扱いには注意が必要です。設置したり編集したりすることで問題が生じた場合は、システム管理者にご相談ください。


PanicアプリでSSH鍵を使用する

どのように処理されるかはアプリケーションによって異なりますが、私たちのすべてのアプリケーションが鍵認証方式をサポートしています。

サポート形式

PEM形式のECDSARSA方式および、OpenSSH形式のEd25519ECDSARSA方式がサポートされています。

FIDO2認証

Transmit 5.9.0から、ECDSA-SK もしくは Ed25519-SK形式のFIDO2認証鍵がサポートされるようになりました。

認証鍵を含む認証デバイスはUSB経由で接続する必要があります。現時点でNFCは未対応です。FIDO2鍵の設定でPINが必要な場合、Transmitは接続プロセス中にダイアログを表示します。

サーバはPIV鍵を使用するのと同じ方法で認証にFIDO2鍵を使用するよう構成が可能です。パスワード欄の認証鍵アイコンをクリックし、リストから目的の鍵を選択してください。

メモ: ファイル転送にFIDO2認証を使用する場合、何度も再認証する必要が無いよう “詳細サーバ設定” で同時接続数の上限を 1 に設定することをお勧めします。

FIDO2認証鍵生成と読み込み

弊社のmacOS版アプリでは、ECDSA-SK および Ed25519-SK 両形式でFIDO2鍵を生成するためのサポートが追加されています。

新規に認証鍵を生成するには、設定 > 認証鍵を開き、認証デバイスをMacに接続します。続いて “+” ボタンをクリックし、リストから目的の形式を選択します。新しい認証鍵の名前、デバイスのPINおよび必要に応じてその他構成オプションを入力します。最後に"生成"ボタンをクリックし、生成プロセスを完了するためのプロンプトが表示され、認証デバイスにタッチして必要な操作を行います。

認証鍵の生成が正常に完了すると認証トークンがデバイスに保存されます。そして秘密鍵ファイルへの参照情報が認証鍵リストに追加されます。

ECDSA-SK または Ed25519-SK FIDO2 認証鍵が既に生成されている場合は秘密鍵参照ファイルを読み込むことも可能です。境設定の認証鍵設定にて"新規認証鍵"のオプションから"読み込み"を選択してください。

非推奨の認証鍵形式

DSA形式は2016年のOpenSSH バージョン7.0からサポートされなくなりました。

OpenSSHは自身の脆弱性のため、DSA公開鍵アルゴリズムを推奨していません DSA鍵はmacOS Sierraではデフォルトで利用できません。DSA方式の利用は強くお勧めしません。

PuTTY/PPK

PuTTY (PPK) も未サポートです。PuTTY形式の鍵ファイルをお持ちの場合はOpenSSH/PEM形式に変換してご利用ください。

これからは

libssh2およびOpenSSLベースのライブラリを使用しています。Transmit 5Coda 2PromptTransmit iOSそしてCode Editorで既に使用しており、以下がサポートされています:

鍵交換アルゴリズム

ecdh-sha2-nistp256
ecdh-sha2-nistp384
ecdh-sha2-nistp521
curve25519-sha256
curve25519-sha256@libssh.org
diffie-hellman-group-exchange-sha1
diffie-hellman-group14-sha1
diffie-hellman-group1-sha1
diffie-hellman-group-exchange-sha256
diffie-hellman-group14-sha256
diffie-hellman-group16-sha512
diffie-hellman-group18-sha512

暗号化アルゴリズム

chacha20-poly1305@openssh.com
aes128-ctr
aes192-ctr
aes256-ctr
aes128-cbc
aes192-cbc
aes256-cbc
blowfish-cbc
arcfour
arcfour128
cast128-cbc
3des-cbc

MACs

sha2-512-etm@openssh.com
sha2-512
sha2-256-etm@openssh.com
sha2-256
sha1
sha1 96
ripemd160

libssh2で提供される形式に加え、ECDSAおよびEtMを独自にサポートしました。私たちは引き続きこのライブラリを磨いていき、libssh2プロジェクトへ貢献していきたいと考えています。

これまでは

Transmit 4(およびCoda 1)は Mac OS XにビルトインされているOpenSSHライブラリを利用していました。よってTransmit 4およびCoda 1で利用可能な形式は、OSによって提供されるライブラリに制限されていました。

ホスト鍵認証

サーバへの初回接続時、サーバが用いる自己識別鍵を次回以降の接続に利用するためローカルコピーします。以降、接続先のサーバが以前に接続したクライアントと同一であることの確認にこの鍵が使用されます。ホスト鍵の立証が無い場合、私たちは中間者攻撃に対し脆弱となります。

もしホスト鍵の変更が警告され、初回接続時で無い場合、以前の接続から変更されたことを意味します。もしこの警告が予想外である場合は直ちにホスト鍵を拒否し、サーバ接続を中止してシステム管理者にご相談ください。

Transmit(バージョン5以降)、Coda iOSおよびPromptでは、サーバの初回接続時にフィンガープリントが表示されるよう設計されています。サーバ設定からいつでも確認が可能です。

CodaTransmit iOSそして以前のバージョンのTransmitでは、初回接続時に自動的に受諾されます。ほとんどの場合問題ありませんが、信頼性の低いローカルネットワーク上での動作の場合は信頼性が確実で無い場合があるかも知れません。

CodaおよびTransmitでは、~/.ssh/known_hostsファイルを開き、接続しているサーバと一致するかによって確認することが可能です。リセットする場合はknown_hostsファイルから当該サーバ行を削除してください。

Coda iOSおよびPromptでは、いつでもサーバ設定からホスト鍵フィンガープリントを確認することが可能です。

上級機能

PromptおよびCoda iOSのターミナルでは更に、エージェント転送機能が利用可能です。CodaTransmitおよびTransmit iOSでは未サポートです。

ポート転送X11転送およびProxyCommandも現時点で未サポートです。


アプリケーション毎の注記

Prompt

新規サーバ接続画面のパスワード欄の隣に、鍵アイコンがあります。パスフレーズで保護された秘密鍵を選択すると、秘密鍵の選択後に入力ダイアログが現れます。

重要! エージェント転送で鍵認証を利用する場合は予め、秘密鍵を選択してパスフレーズを入力しておく必要があります。

Promptの設定から認証鍵リストを選択して現れる画面では、認証鍵の読み込みや生成が行えます。

新たに生成したり任意の認証鍵を追加したりするには、設定から認証鍵リストを選択し、右上の**+ボタンをタップします。そして認証鍵を生成するもしくはクリップボードからペーストする**を選択してください。

認証鍵を生成する

新たに認証鍵を生成するには、認証鍵リストから右上の**+ボタンをタップし、認証鍵を生成するを選択します。鍵の名前とオプションでパスフレーズを設定することが可能です。さらに鍵の形式とサイズを選択して"生成"をタップすると鍵のペアが作成されます。完了後公開鍵をコピー**をタップするとペーストボードに格納されます。

作成された公開鍵はリモートサーバに設置します。そのため、ユーザ名とパスワードによる認証でサーバに接続します。接続したらリモートサーバの~/.ssh/に移動し、authorized_keysもしくはauthorized_keys2を見つけてください。そしてテキストエディタなどで開き、公開鍵の内容を追記します。

クリップボードからコピーする

iOSのクリップボードから秘密鍵をコピーして読み込むことも可能です。クリップボードに秘密鍵がコピーされている状態でPrompt設定から認証鍵リストを選択し、右上の**+ボタンをタップしてクリップボードからコピーする**を選択します。Promptが取り扱える秘密鍵の形式である場合、読み込みが完了します。

iTunesから読み込む

iTunesファイル共有機能を使用して秘密鍵を読み込むことも可能です。なお、PromptはiTunesファイル共有機能を利用したファイル転送はサポートしていません。認証鍵ファイルのみがサポートされています。

エージェント転送

Promptでは認証エージェント転送機能が利用可能です。サーバ設定の認証エージェント転送トグルスイッチをオンにしてください。認証鍵がパスフレーズで保護されている場合はあらかじめ、サーバ設定に認証鍵を追加する際に認証を済ませておく必要があります。


Coda

サイト設定タブのサーバペインに、鍵アイコンボタンがあります。このボタンを押すと、接続時に利用する秘密鍵を選択するためのダイアログが表示されます。そしてCodaは自動的に.sshフォルダを開きます。

選択すると、Codaはそれが利用可能な鍵形式かをチェックします。

パスフレーズで保護された鍵ファイルを利用したい場合は鍵アイコンボタンから選択が行えません。 そのような場合はConfigファイルをご活用ください

Configファイルを設置し、パスフレーズをCodaのサイト設定のパスワード欄に入力することで利用が可能となります。

Codaのターミナルソース管理そしてMySQLの各機能でも鍵認証をサポートしていますが、それらで利用するには予めConfigファイルを記述し、設置する必要があります


Transmit 5

最新のTransmitでは認証鍵を管理する機能が追加されています。さらに、Transmit 5でもConfigファイルのご活用が可能です

その他、Transmit 5における鍵認証について包括的な情報はライブラリ Transmit 5 SFTP認証についてをご参照ください。


Transmit 4

SFTPサーバに接続しようとする際、パスワード蘭の右に鍵アイコンがあることに気づかれるでしょう。これはCodaで説明したのと同様、押すと秘密鍵を選択するためのダイアログが表示されます。Transmitは .ssh フォルダで見つけた認証鍵を自動的に利用しようとします。

このボタンから追加する際、Transmitは鍵形式を検証しサポートされている有効な形式どうかを自動的にチェックします。

**認証鍵がパスフレーズで保護されている場合、Transmitの選択ダイアログはそれを確認できません。**そのような場合はconfigファイルによる管理をご利用ください。

Configファイルを設置し、パスフレーズをTransmitの接続パネルのパスワード欄に入力することで利用が可能となります。


Coda iOS

サイト設定画面のサーバ接続情報タブにある、パスワード欄の隣に鍵アイコンがあります。パスフレーズで保護された秘密鍵を選択すると、秘密鍵の選択後に入力ダイアログが現れます。入力しない場合、サーバ接続時に毎回尋ねられます。

重要! エージェント転送で鍵認証を利用する場合は予め、秘密鍵を選択してパスフレーズを入力しておく必要があります。

設定認証鍵を選択して現れる画面では、認証鍵の読み込みや生成が行えます。

新たに生成したり任意の認証鍵を追加したりするには、設定から認証鍵を選択し、右上の**+ボタンをタップします。認証鍵を生成するクリップボードからペーストする**など、希望の方法を選択してください。

新規認証鍵を生成

新たに認証鍵を生成するには、Coda設定から認証鍵を選択し右上の**+ボタンをタップし、新規認証鍵を生成をタップします。鍵の名前とオプションでパスフレーズを設定することが可能です。さらに鍵の形式とサイズを選択して"生成"をタップすると鍵のペアが作成されます。完了後公開鍵をコピー**をタップするとペーストボードに格納されます。

作成された公開鍵はリモートサーバに設置します。そのため、ユーザ名とパスワードによる認証でサーバに接続します。接続したらリモートサーバの~/.ssh/に移動し、authorized_keysもしくはauthorized_keys2を見つけてください。そしてテキストエディタなどで開き、公開鍵の内容を追記します。

クリップボードから読み込む

iOSのクリップボードから秘密鍵をコピーして読み込むことも可能です。クリップボードに秘密鍵がコピーされている状態でCoda設定から認証鍵を選択し、右上の**+ボタンをタップしてクリップボードからペーストする**を選択します。Coda iOSが取り扱える秘密鍵の形式である場合、読み込みが完了します。

ローカルから読み込む

このオプションを選択すると、iOSデバイスのローカルストレージから秘密鍵を読み込むことが可能です。Macから秘密鍵を読み込んで使用する等の時に便利です。同じローカルネットワーク上にMacが存在する場合はCodaからあなたのMacに接続し、Codaの Local ファイルストレージにコピーすることができ、コピーされた認証鍵を読み込むことができます。

iTunesから読み込む

iTunesファイル共有機能を使用して秘密鍵を読み込むことも可能です。なお、Coda iOSはiTunesファイル共有機能を利用したファイル転送はサポートしていません。認証鍵ファイルのみがサポートされています。

エージェント転送

Coda iOSでは認証エージェント転送機能が利用可能です。サーバ設定の認証エージェント転送トグルスイッチをオンにしてください。認証鍵がパスフレーズで保護されている場合はあらかじめ、サーバ設定に認証鍵を追加する際に認証を済ませておく必要があります。


Transmit iOS

サーバ接続情報画面にあるパスワード欄の隣に鍵アイコンがあります。パスフレーズで保護された秘密鍵を選択すると、秘密鍵の選択後に入力ダイアログが現れます。入力しない場合、サーバ接続時に毎回尋ねられます。

設定認証鍵を選択して現れる画面では、認証鍵の読み込みや生成が行えます。

新たに生成したり任意の認証鍵を追加したりするには、設定から認証鍵を選択し、右上の**+ボタンをタップします。認証鍵を生成するクリップボードからペーストする**など、希望の方法を選択してください。

新規認証鍵を生成

新たに認証鍵を生成するには、Transmit設定から認証鍵を選択し右上の**+ボタンをタップし、新規認証鍵を生成をタップします。鍵の名前とオプションでパスフレーズを設定することが可能です。さらに鍵の形式(RSAをお勧めします)とサイズ(2048もしくは4096をお勧めします)を選択して"生成"をタップすると鍵のペアが作成されます。完了後公開鍵をコピー**をタップするとペーストボードに格納されます。

作成された公開鍵はリモートサーバに設置します。そのため、ユーザ名とパスワードによる認証でサーバに接続します。接続したらリモートサーバの~/.ssh/に移動し、authorized_keysもしくはauthorized_keys2を見つけてください。そしてテキストエディタなどで開き、公開鍵の内容を追記します。

クリップボードから読み込む

iOSのクリップボードから秘密鍵をコピーして読み込むことも可能です。クリップボードに秘密鍵がコピーされている状態でTransmit設定から認証鍵を選択し、右上の**+ボタンをタップしてクリップボードからペーストする**を選択します。Transmit iOSが取り扱える秘密鍵の形式である場合、読み込みが完了します。

ローカルから読み込む

このオプションを選択すると、iOSデバイスのローカルストレージから秘密鍵を読み込むことが可能です。Macから秘密鍵を読み込んで使用する等の時に便利です。同じローカルネットワーク上にMacが存在する場合はTransmitからあなたのMacに接続し、Transmitの Local ファイルストレージにコピーすることができ、コピーされた認証鍵を読み込むことができます。

iTunesから読み込む

iTunesファイル共有機能を使用して秘密鍵を読み込むことも可能です。なお、Coda iOSはiTunesファイル共有機能を利用したファイル転送はサポートしていません。認証鍵ファイルのみがサポートされています。


トラブルシューティング

なぜ私の認証鍵は未サポートの形式と警告されるのですか?

macOS版のCodaTransmitである場合、もっとも多いケースはパスフレーズ付きの鍵ファイルをサーバ接続情報画面から追加しようとしている場合です。CodaおよびTransmitはその認証鍵を使用するために登録しようとするのですが、パスフレーズで保護されているために行えずエラーとなります。(この挙動は将来のバージョンで改善される予定です。)

回避するには、使用したい認証鍵とサーバを~/.ssh/configファイルに記述した上で、サーバ接続情報のパスワード欄に認証鍵のパスフレーズを入力してください。

それ以前に、Putty形式など未サポートの形式でなく、サポートされている形式であることも事前にご確認ください。

クリップボードから読み込めません

サポートされている形式の認証鍵を読み込もうとしているかどうかを改めてご確認ください。

また、クリップボードから読み込めるのは秘密鍵のみで公開鍵は読み込めません。

まれに、macOSの機能により代理テキストがペーストされる場合があり、これがエラーの原因である場合があります。例えば、秘密鍵に含まれる_ハイフン_ (----) をペースト時に親切にも em-dashes (––)に置き換えられる場合があります。

例えば、下記の様なケースが実際にあります:

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAy1jdr+ez1DWbELFFHUR2LYegzv2K5DKFrP8FXOLBNoPvH5nr
seh/EqkCgYEA6iSdXnky6ilRQe2V5e1SepzFFW4MqS9tZUyLfT+c2CS/CKjv0Xj0
<snip>

上記の内容をペーストすると:

–––BEGIN RSA PRIVATE KEY–––
MIIEowIBAAKCAQEAy1jdr+ez1DWbELFFHUR2LYegzv2K5DKFrP8FXOLBNoPvH5nr
seh/EqkCgYEA6iSdXnky6ilRQe2V5e1SepzFFW4MqS9tZUyLfT+c2CS/CKjv0Xj0
<snip>

これは些細な変化ですが、認証鍵が破損します。ご注意ください!