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

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

Use Keys, Not Passwords

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

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

仕組みについてわかりやすく説明されたこちらのビデオもぜひご覧ください。

鍵認証を行う前に

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

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

鍵のペアを生成する

お使いのアプリケーションがCoda for iOSTransmit for iOSもしくはPromptの場合、鍵の生成機能が搭載されています。

Macでご利用の場合はコマンドラインを利用します。ターミナル.appを起動し、以下のコマンドを入力してください:

$ ssh-keygen -t rsa -b 4096

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

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

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

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_rsa.
Your public key has been saved in /Users/YOU/.ssh/id_rsa.pub.

The key fingerprint is:
SHA256:DD388JM7gMpxRm7y+8qjF7pOtIrzF56htWdrZuLwZQk YOU@YourMac.local

The key's randomart image is:
+---[RSA 2048]----+
|                 |
|       o         |
|      o =        |
|     o + = .     |
|    E * S =      |
|   o+@.. . o     |
|  .+=*=.  o      |
|...=B+O.   .     |
|.oo+*@==.        |
+----[SHA256]-----+

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

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

公開鍵

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

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

$ cat ~/.ssh/id_rsa.pub

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

ssh-rsa AAAA75e8wZ/YTf3T8xz/gqnmTkKFMkCUBHMahpqHY7VdprMJqYVhu//v1OyNkSFfZ/jh/WLE+d3mIXUsRD1nBZDhkoKqdAuCt2Bw+Jy6fZnDfBpDv8uzYvuiGh5f9XT+0jVdj8aaqe09/C5yEwW2P2g2XZ4XqvT4NzaC1yc2EAAAADAQABAAABAQDLWN2v57PUNZsQsUUdRHYth6DO/YrkMoWs/wVc4sE2g+8fmevhYiVPIEWtbtJM5vz4hFVyhBzcw+TU6kStfZO9BwWEmpts13lE1OhWr2l0/YNLooN4k8ulKd7zLPoD/vMUNiRqSNjgR71ydLAJQiPbYAqLVREnxGa/0OMmBQTjmB3U2yv/DNljBTL7FT YOU@YourMac.local

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

秘密鍵

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

$ cat ~/.ssh/id_rsa

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

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAy1jdr+ez1DWbELFFHUR2LYegzv2K5DKFrP8FXOLBNoPvH5nr
seh/EqkCgYEA6iSdXnky6ilRQe2V5e1SepzFFW4MqS9tZUyLfT+c2CS/CKjv0Xj0
wItywKAlHCdLT6kqQjH4oct86UuWJJfqTsFZz56FT/Mx94X5OEM8cRWusc1K7CRo
D3xyL23Lf6Iew0F3rRsBQ/hp93Wn7xOGwBf4kOfByhxcjoMBn1fYFN0CgYEA3lRQ
Cbsciytes2kNTkbtBub132iH4Rcd5Nc0SeoERukvd5bp8Km8ufrODS1sVXRF4eeO
4a84hoQxQje/OjXM7r1b2zcqZpcUXZd4VgjaWxJAC7PtNXvKR3ohZFdIWM247Bma
eWZvBQKBgCXMzOJVczLvoeNDFF5uL+2e4ZgXGeVjC2rJsHeM5rrcSVBYxjJsObuO
eJPLpSne8yz6A/7zFDYkakjY4Ee9cnSwCUIj22AKi1URJ8Rmv9DjJlNsr/wze+Xv
MGf2E390/Mc/4Kp5k5ChTJAlARzGoaah2O1XaazCamFYbv/79TsjZEhX2f44f1ix
D3xyL23Lf6Iew0F3rRsBQ/hp93Wn7xOGwBf4kOfByhxcjoMBn1fYFN0CgYEA3lRQ
Poc/jfx9E7Ni5x3XE8rBU+vtmDLPk64WcN1iI+8CgYEAi3Ee34Kild3hbLgHy5UY
x7jRjr+pfqCmL+v0LrVRvU+1DX0+xauZZ4ok3x8AutGUAm8moaGNBx5e17mSQ1zN
x/VSfVlU35ZgLZ92GtHAD0Dwdydh9VyBNKfSgPiMdwif9XzpvwgUKtyojx1c0/73
AzPDbtj3Clz1qlHPB4yTPWkCgYAfT+SN2kpk11DZF7yF/7s2M6UBN+mbK/RL3HtC
xbCghArpXtnHyUAJOWd3t6QATQXikQgwhMsDNu7xEoTeH+Gi5gxfzV8tX63AmKqc
A1ctaF6Yx1hrJeoRMwQs65YG28Jljh2JHOc4igzbj3Iodq1p3i5oMVwfCVjuxZ/n
7+AIAYnXO72EEjkEEKxN58w64bObz9OV+5Zite086dK/gqjB34oZbqe9PPRhKD37
XxIVO+cy7d+Py/SpoJ0uADENnJMlVaOM+K6O0yggIa+UrBAMYqQLICAeM9vGrrkm
MIIEowIBAAKCAQEAy1jdr+ez1DWbELFFHUR2LYegzv2K5DKFrP8FXOLBNoPvH5nr
4WIlTyBFrW7STOb8+IRVcoQc3MPk1OpErX2TvQcFhJqbbNd5RNToVq9pdP2DS6KD
u779fHKpFu/w6oBUVjJk7oJu9xCUnW+bEh7LpT7ZRcVZsuww8QSmuidThXjYJ9BI
3y5BB7o/viMlhPCKBAOdFJRvXeHXT/NsoSc6xwIBIwKCAQEAn1Wep1z/2wBsm9Vc
XRi9qosb3a6vgiJ1UcvI0rcGWhqdLxk5CZqHoMsMksAygLhAmupTTP2zAR0ld2Fp
FpnvUZYSDHyEnW2lewojx4qPRvTzaIavPfzVH+y9VYyyaFhCOvOGPHUClHGugkst
fuDTxUwwSmVnIbZOYG50fYcScxpOOM/s16c6LFIo3cp+Lix99qOz
-----END RSA 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形式のECDSARSADSA方式がサポートされています。

ED25519鍵はTransmit 5でのみサポートされています。

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

PuTTY/PPK

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

これからは

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

KexAlgorithms
diffie-hellman-group-exchange-sha1
diffie-hellman-group14-sha1
diffie-hellman-group1-sha1
diffie-hellman-group-exchange-sha256
ecdh-sha2-nistp256
ecdh-sha2-nistp384
ecdh-sha2-nistp521
Ciphers
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によって提供されるライブラリに制限されていました。

ホスト鍵認証

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

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

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

CodaTransmitそしてTransmit iOSでは初回接続時に自動的に受諾されます。ほとんどの場合問題ありませんが、信頼性が確実で無い場合があるかも知れません。

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

上級機能

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

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


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

Coda

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

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

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

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

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


Transmit 5

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

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


Prompt

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

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

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

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

認証鍵を生成する

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

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

クリップボードからペーストする

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

iTunesから読み込む

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

エージェント転送

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


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>

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