ssh - リモートログインを行う

スポンサーリンク

リモートサーバにログインするときに利用するSSHクライアントのコマンドになります。SSHはSecure Shellの略で、2つのホスト間で安全な暗号化通信を確立できます。

また、sshコマンドと組み合わせて利用するコマンドやプログラムがいくつかあります。例えば、sshコマンドで利用するための秘密鍵と公開鍵を生成するために、ssh-keygenコマンドが利用できます。また、パスワード入力を省略するためのプログラムとしてssh-agentがあります。

スポンサーリンク

鍵の作成とその配送手段の例

sshコマンドでは基本的に秘密鍵(secret key)と公開鍵(public key)を利用して、リモートサーバにログインすることが多いです。なので、まず、鍵の作成方法とその配送手段の例について説明します。

 

 

 

鍵の配送手段を検討

鍵の配送手段はいくつかの方法が考えられます。USBメモリ等で公開鍵を物理的に配送する方法やSSHでとりあえずパスワード認証で入れるようにしておいて公開鍵を転送する方法、既に作成済みの秘密鍵と公開鍵を用いて別の公開鍵を転送する方法などがあります。

ここでは、サーバ側へパスワード認証で公開鍵を転送する方法を想定します。
そのためにサーバ側にパスワード認証で入ることができるかを確認します。

sshコマンドの簡単な使い方

初回接続の場合は、接続先が正しいかどうかを尋ねられます。基本的にここはyesを選択し、次にサーバ側のログインパスワードを入力することでリモートサーバにログインができます。また、ログアウトを行う場合はexitコマンドでログアウトできます。

実際の例

2回目以降の接続の場合、接続先が正しいかどうかは尋ねられません。サーバ側のログインパスワードだけで入ることができます。

補足として、ホスト名やIPアドレスがなりすましで実際の接続先と異なる可能性があるため、接続が初回の場合はフィンガープリント(fingerprint)で接続先が本当に正しいかどうかが尋ねられます。

このフィンガープリントは、サーバ側から渡される公開鍵になります。確認する例としては、サーバ側の/etc/ssh/<鍵の種類>.pubにいくつかのフィンガープリントで渡される公開鍵があり、ssh-keygenコマンドでフィンガープリントを表示させる方法があります。
ここでは、パスワード認証でEDCSAの公開鍵のフィンガープリントが渡されているので、その確認を行います。

上の初回接続時に尋ねられたフィンガープリントと一緒であることが分かります。このフィンガープリントの仕組みで相手先がなりすましではなく、正しい接続先かどうかが分かります。
また、サーバ側からの公開鍵はクライアント側の~/.ssh/known_hostsに保存されます(接続先が増えていくと追記されます)。
このknown_hostsに書かれている接続先では、フィンガープリントを尋ねられなくなります。ここで、フィンガープリントでknown_hostsを確認してみます。

1行目のフィンガープリントは、上で確認したフィンガープリントと同じと確認できます。
登録してあるフィンガープリントで接続先が違うフィンガープリントの場合、接続ができない場合があるので注意が必要になります。

 

 

 

鍵の作成

ここでは、2048ビットのRSA鍵の作成を行います。ssh-keygenコマンドを用いて、tオプションでrsaを指定することでRSA鍵が作成できます。

尋ねられることは

  • 鍵ファイルを保存する場所
  • 鍵のパスフレーズ(パスワード)

になります。鍵が作成されると、秘密鍵(ここではid_rsa)と公開鍵(ここではid_rsa.pub)が作成されます。
さらに、あまり意識しなくてもいいですが、フィンガープリントとフィンガープリントを視覚化したrandomartが表示されます。randomartはフィンガープリントを人間が確認したい場合、文字を見るよりもさっと違いが確認できます。

補足として、ssh-keygenコマンドのlオプションを用いるとフィンガープリントを確認できます。さらにvオプションをつけるとrandomartを表示できます。また、下の例のfオプションはファイルの指定になります。

 

 

 

公開鍵の転送

公開鍵を転送するコマンドとして、ssh-copy-idコマンドがあります。このコマンドを利用すると指定したホストに簡単に公開鍵を転送することができます。

実際の例

基本的にはssh-copy-idコマンドの方が簡単ですが、以下の方法でも鍵を転送することもできます(userとhostnameは書き換える必要があります)。

また、このコマンドで、sshで実行されるコマンドの意味は以下のようになります。

  • cdコマンドでホームディレクトリに移動
  • umaskコマンドでファイル作成の権限のマスクをセット(権限の077の部分(グループと他のユーザの権限)がセットされなくなります。つまり、ファイル作成時の権限は700の部分(自ユーザ)しかセットできなくなります)
  • .sshのディレクトリ作成(ディレクトリの作成の権限はumaskの設定が000だと、777になりますが、上のumaskコマンドの設定だと権限は700で作成されます)
  • 標準入力にバッファしている内容(id_rsa.pubの内容)を./ssh/authorized_keysに作成または追記(ファイルが作成される場合の権限はumaskの設定が000だと、666になりますが、上のumaskコマンドの設定だと権限は600で作成されます)

実際の例

 

 

 

ログインの確認

sshコマンドを実行するとき、デフォルトでは、秘密鍵として、~/.ssh/id_rsa,~/.ssh/id_ecdsa等が指定されます。
ここでのパスワードはログイン時のパスワードではなく、鍵を作成したときのパスワードを入力します。
別の秘密鍵のファイルを指定したい場合は-iオプションで指定します。

 

 

 

簡単なまとめ

鍵の作成からログインの確認までの必要なコマンドのみを記述すると以下のようになります。鍵ファイルの保存場所をデフォルトのまま利用していますが、鍵の保存場所を変更したい場合でもコマンドにオプションがつけられるだけで、概ね以下のような流れになります。

 

指定する鍵ファイルを変更したい場合(例として鍵ファイルは秘密鍵が~/.ssh/testkeyで、公開鍵は~/.ssh/testkey.pubとした場合)

 

 

 

sshコマンドの利用

sshコマンドでログイン

sshコマンドで引数に"ユーザ名@ホスト名"を指定すると、リモートサーバを対話的に操作するためのシェルが起動されます(ユーザ名は-lオプションで指定も可)。

コマンド例

また、ユーザを省略すると、sshクライアントを起動しているユーザ名が指定されます。ここではCtrl+Cでログインを中止しています。

ポート番号を指定したい場合は、-pオプションを利用できます。ポート番号の指定がない場合は、デフォルトで22番ポートが指定されます

 

 

 

シェルを起動せずにコマンドを実行

リモートサーバで特定のコマンドを実行したい場合は、sshコマンドのホストの後に、そのままコマンドを記述すると、その内容がリモートサーバで実行され、出力を返してくれます。

下の例では、ssh-agentを利用して、事前に鍵のパスワードを登録してから、コマンドを実行しています。

USERとSSH_CONNECTIONはsshを利用するときに設定される環境変数になります。

  • USER: ログインするユーザ名
  • SSH_CONNECTION: クライアント側のIPアドレスとポート番号、サーバ側のIPアドレスとポート番号(スペース区切り)

 

 

 

踏み台サーバを経由して目的サーバまでのsshログイン

踏み台サーバを経由して目的サーバまでのsshログインの方法にはいくつかあります。
ここでは、ローカルマシン、踏み台サーバ(step server)、目的サーバ(target server)の3つのマシンがあることを前提に説明します。

また、ローカルマシンから踏み台サーバを経由して、目的サーバに公開鍵を渡す方法は様々な方法がありますが、ここでは、-Jオプションを利用したものと、-oオプションのproxycommandを利用したものを紹介します。また、踏み台サーバには既にローカルマシンの公開鍵を渡している前提とします。
コマンドの例を分かりやすくするために、踏み台サーバのホスト名を変数stepserver、目的サーバにはホスト名を変数targetserverに入れています。

-Jオプション(OpenSSH7.3以降)を利用する場合
下の例で入力しているパスワードは、踏み台サーバの鍵のパスワード、目的サーバのユーザにログインするためのパスワード(鍵をまだ渡していないため)になります。

 

sshコマンドの-oオプションのproxycommandを利用する場合
変数やパスワード入力は上の-Jオプションの時と同様になります。

 

ログインする方法も同様に-Jオプションを利用した場合と、-oオプションのproxycommandを利用したものを紹介します。

-Jオプションを利用する場合

 

sshコマンドの-oオプションのproxycommandを利用する場合

 

パスワードが面倒な場合はssh-agentを用いると楽になります。

 

また、ssh_configを用いるとコマンドが短縮できます。ここでは、ProxyJumpのキーワードを用いた場合とProxyCommandのキーワードを用いた場合を紹介します。踏み台サーバは10.0.2.5で、目的サーバは192.168.0.102になります。

ProxyJumpを用いる場合

~/.ssh/config

 

コマンド例

 

ProxyCommandを用いる場合(sshクライアントのバージョンが古くて、ProxyJumpが利用できない場合に利用できます)

~/.ssh/config

 

コマンド例

 

 

 

ssh-agentコマンドとssh-addコマンド

ssh-agentは作業を行う際に、鍵認証でのパスワード入力を一回入力することで以降のパスワード入力を省略できるようにするプログラムです。ssh-agentはUnixドメインソケットを利用して、SSHクライアントと通信をし、ユーザの代わりにパスワード入力を行います。

ssh-addコマンドはssh-agentに秘密鍵をプログラムメモリ上に登録するコマンドで、このコマンドで登録した秘密鍵を用いるSSHログインをするとき、パスワード入力の作業を省略することができます。

ssh-agentは便利なプログラムですが、セキュリティ上にもいくつか問題はあります。例えば、カレントユーザしか読み取れないssh-agentのUnixドメインソケットがルートユーザやその同じユーザのプログラムインスタンスによって悪用される可能性や、実世界でssh-agentを使用しているマシンを意図しないユーザが操作し簡単にリモートサーバにログインできてしまう点は注意が必要です。

ssh-agentの起動

ssh-agentを利用したいときに起動する前に一度、ssh-agentが起動していないことを確認してみても良いでしょう。ssh-agentに関係する環境変数はSSH_AGENT_PIDとSSH_AUTH_SOCKで例えば、envコマンドで環境変数を確認すると

上のように設定されている場合があります。例えば、これは、ssh-agentが自動起動に設定されている場合がある例となります。

上のように環境変数が設定されていない場合は、ssh-agentコマンドを実行してssh-agentを起動します。起動の仕方は少し変わっていて、evalコマンドを通して、実行します。

または、バッククォートを利用して

実行させます。

理由としてはssh-agentコマンドが以下のような出力を行うためです。

補足(これは実行しないでください)

ssh-agentコマンドをevalコマンドを通して実行することによって、ssh-agentを起動させ、同時に環境変数も設定することができます。

 

 

 

鍵の登録とssh-agentが利用されたSSHログイン

ssh-addコマンドを利用することでssh-agentの鍵の登録を行うことができます。鍵の登録時にパスワードを尋ねられ、入力することで登録は完了し、SSHログインを行うときにパスワード入力を省略することができます。

また、引数を省略すると、
* ~/.ssh/id_rsa
* ~/.ssh/id_dsa
* ~/.ssh/id_ecdsa
* ~/.ssh/id_ed25519
* ~/.ssh/identity
のファイルに対して、ssh-addコマンドが実行されます。

ssh-agentを利用しない場合と利用した場合のログイン例

 

 

 

時間制限付きで鍵の登録

ssh-addの-tオプションを用いることで鍵の登録期間を設定することができます。時間文字列の詳しくはman 5 sshd_configのTIME FORMATSのセクションに書かれています。

時間文字列は上の例以外では'd'で日、'w'で週になります。

 

 

 

登録されている鍵のFingerprintsの一覧の確認

ssh-addの-lオプションを用いると登録されている鍵のフィンガープリントの一覧を確認できます。

 

 

 

登録されている鍵の削除

ssh-addの-dオプションを用いると登録されている鍵を登録から削除できます。引数を省略すると~/.ssh/id_rsa, ~/.ssh/id_ecdsa等のファイルが指定されます。

コマンド例

また、-Dオプションを用いると登録している鍵をすべて削除できます。

 

 

 

ssh-addコマンドでssh-agentのロックとアンロック

ssh-addコマンドでssh-agentを一時的にロックすることができます。

コマンド例ではロック時では、ssh-agentが機能せず、鍵のパスワードが聞かれていますが、アンロックするとssh-agentが機能し、鍵のパスワードが聞かれずにログインできます。

コマンド例

 

 

 

ssh-agentの終了

ssh-agentを自分で終了させたい場合は以下のように行います。

または

同様に補足として、ssh-agent -kコマンドは以下のような出力を行います。(上とプロセスIDが異なっていますが、あくまで出力例になります)

補足(これは実行しないでください)

 

 

 

パスワードなしの鍵を作成してログイン

鍵の作成時にパスワードを空にすれば、sshの公開鍵認証でパスワードを入力する必要がなくなります。セキュリティと利便性を考えた上で利用してください。

鍵の作成を行うときにパスワード入力せずにエンターキーのみを入力します。

次に、鍵の転送を行います。ssh-copy-idコマンドを用いて、-iオプションで公開鍵を指定します。
そして、パスワードを入力し(ここでは公開鍵認証を利用したログインのため、パスワードなしの鍵とは別の鍵作成時のパスワードを入力しています)、鍵を転送します。

ログインをするときに、パスワード入力せずにログインできます。

 

 

 

ssh_configで事前に接続先の情報を記述し、コマンドを簡略化

ssh_configはSSHクライアントの設定ファイルになります。この設定ファイルは、~/.ssh/configまたは/etc/ssh/ssh_configを作成することで使用できます。
設定の優先順位は

  1. コマンドラインオプション
  2. ~/.ssh/config(ユーザの設定)
  3. /etc/ssh/ssh_config(システムの設定)

になります。

ここでは簡単なconfigファイルを作成して実行してみます。

~/.ssh/config

上の設定ファイルについて、
Hostのキーワードは、configに使用するキーワード(HostNameやUser等)を、その指定したパターンに限定することができます(次のHostまたはMatchのキーワードが現れるまで)。これはsshコマンドライン引数で使用するホスト名になります。そのため、サーバの名称の略語などを設定できます。
HostNameは、実際のホストのアドレスを指定します。Hostをニックネームや略語で設定した場合に使用します。これがない場合はHostNameはコマンドライン引数で指定されたホスト名と同じになります。
Userは、ログインするユーザを指定します。

コマンド例

sshのconfigファイルを作成すると、使用するsshコマンドを簡単なものにできます。