SSH の使い方

2017年6月3日

はじめに

Linux で SSH を利用する方法について。

サーバーへの接続

SSH によるサーバーへの接続は次のようにする。

$ ssh host

コマンドだけ実行させることもできる。

$ ssh host command

X を使う

オプション "-X" で X が使えるようになる。

$ ssh -X host

あるいは /etc/ssh/ssh_config の設定を以下のようにしておけば、オプションなしでも X が使える。

ForwardX11 yes
ForwardX11Trusted yes

コマンド実行での環境変数の設定

環境変数の設定を ~/.bashrc などで行なっているが、ログインを伴わない (インタラクティブでない) コマンド直接実行の場合、~/.bashrc のような設定ファイルは基本的に読み込まれないことになっているらしい。

Red Hat 7 では ~/.bashrc は読まれるらしい。Ubunt 14.04 LTS の場合、デフォルトの ~/.bashrc だと先頭に以下のように書いてある。

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

つまり、~/.bashrc 自体は読み込まれているが、自分ですぐに抜けているらしい。この場合、この部分をコメントにしてまえばコマンド実行でも環境変数の設定を有効にできる。

zsh の場合は ~/.zshrc を本当に読まないようなので、/etc/zsh/zshenv に次のように追加してやればよい。

if [ -f "$HOME/.zshrc" ]; then
    . "$HOME/.zshrc"
fi

データの転送

SSH でデータを転送するには SCP を使う。

$ scp file host:path  (サーバーに送る)
$ scp host:path file  (サーバーから受け取る)
$ scp -r dir host:path  (ディレクトリの転送)

公開鍵認証

公開鍵認証を使うと、パスワードなしでログインできる。

公開鍵認証とは

サーバーにログインするための認証としてはパスワードによるものが一般的であった。それとは別の認証方法として、暗号鍵を使うものがある。暗号鍵は暗号通信に使うものである。暗号通信の方法として秘密鍵方式と公開鍵方式がある。

秘密鍵方式では、名前の通り秘密の鍵を使う。その鍵が第三者の手に渡ると暗号データを解読されてしまうため、いかに鍵の不正入手を防ぐかが問題になる。

公開鍵方式では、鍵を公開する。なぜそれが可能かというと、データの暗号化と復号化に別の鍵を使うからである。公開鍵は暗号化用の鍵である。その鍵を第三者が入手したとしても、暗号化しかできないので問題ない。

公開鍵認証は次のように行う。クライアントは暗号化用鍵と復号化鍵を作り、暗号化用鍵をサーバーに渡す。サーバーはそれを使って秘密鍵を暗号化してクライアントに渡す。クライアントは復号化用鍵で秘密鍵を復号化する。復号化用鍵は一歩も外に出ていないので、第三者が転送経路中においてそれを入手したり、それを使ってサーバーの秘密鍵を入手するといった心配はない。クライアントは復号化した秘密鍵を使って認証を行う。あとは秘密鍵方式で通信を行う。

公開鍵認証ではパスワードなしで認証可能である。しかし、公開鍵方式は安全とはいっても、転送経路中における安全である。クライアントマシンごと奪われたらどうしようもない。そのため、パスフレーズの入力を課すこともできる。

設定

クライアント側で公開鍵を作る。

$ ssh-keygen -t rsa
(どこに鍵を作るか聞いてくる。変更しなければ Enter)
(パスフレーズの入力を聞いてくる。必要ないなら Enter)

デフォルトなら ~/.ssh/id_rsa に公開鍵 id_rsa.pub (テキストファイル) ができる。

サーバー側の ~/.ssh/authorized_keys にクライアントの id_rsa.pub の中身の文字列を追加する。authorized_keys のパーミッションは 600 としておく。

ssh-agent

パスフレーズを設定していてもパスフレーズなしでログインできる ssh-agent という仕組みがあるらしい。それが機能している場合、ssh-add で鍵を追加してやらないと鍵を使ってくれない。"ssh-add -l" を実行して、以下のようなメッセージが出てきたら、ssh-agent は動いていない。

ssh-add -l
Could not open a connection to your authentication agent.

もし動いていたら、登録された鍵のリストが表示される。鍵の登録は、次のように行う。

$ ssh-add ~/.ssh/id_rsa

Ubuntu 14.04 LTS マシンが 2 台あって、なぜか 1 台だけ "ssh-add" が必要だった (試しに鍵の登録を削除して再起動したら、今度は鍵が勝手に登録されていた)。もう 1 台は上のメッセージが出て、そもそも ssh-agent が動いていないようだった。違いは不明。

SELinux 環境での利用

Red Hat 7 のマシンに対して鍵認証でログインできない問題があった。

まず、SELinux が機能していると、よそのマシンから持ってきた公開鍵はそのままでは sshd が認識できない (ことがある?) らしい。sshd から認識できるように、以下のように実行。

$ restorecon -R -v $HOME/.ssh

これだけではまだダメだった。何が起こっているか調べるため、sshd を直接起動。

$ su
# service sshd stop
# /usr/bin/sshd -d

この状態で外部からつなぐと、ホームディレクトリのパーミッションの問題で鍵を利用できない、といったメッセージが出ていた。ホームディレクトリのパーミッションが 777 になっていたので、これを 755 にしたら無事鍵認証できた。

参考: SELinuxが有効な環境でSSH公開鍵認証を使う (2done.org)