SSH
SSHの使い方をメモしておく
目次 |
設定
SSHサーバの設定は/etc/ssh/sshd_configを編集する。
セキュリティ上確認すべき主な項目は次の設定。
# rootでのログインを禁止する。この項目がyesならばnoにした方がよい。 PermitRootLogin no # パスワード無しのログインを許すか。 PermitEmptyPasswords no # .rhosts等を信用するか(RSA認証付き) RhostsRSAAuthentication no
ログイン前、ログイン後にメッセージを表示する
- /etc/motd : ログインした後に表示するメッセージ
- /etc/issue.net : ログイン前のメッセージ
パスワードなしで接続する方法
cron等で他のサーバとのやり取りを自動化する際には対話的なインターフェースではないのでパスワード認証では接続できない。そのため、公開鍵認証を用いてインタラクティブな入力なしに接続する方法をまとめる。
公開鍵の作成
まず、ssh-keygenを用いて公開鍵、秘密鍵のキーペアを作る。自動化を目的とする場合、パスフレーズなしで作ることが必要となる。そのため、-Nオプションを用いる。
>ssh-keygen -t rsa -N '' -f no-passphrase-key
ここでは-tオプションで暗号化方式を指定している。-fオプションは鍵の出力先のファイル名を指定しており、この例では秘密鍵がno-passphrase-key、公開鍵がno-passphrase-key.pubにそれぞれ作成される。
公開鍵をサーバに転送して登録する
公開鍵は接続先となるサーバに登録する必要がある。 SSHですでに接続できる場合はsftpを使って転送できる。最後に、.sshディレクトリのアクセス権が700(所有者のみ読み書きOK)になっていることを確認すること。このアクセス権以外では公開鍵で認証しない。
(昔は.sshディレクトリとauthorized-keysファイルのアクセス権が600(所有者のみ読み書きOK)、400(所有者のみ読み取りOK)になっていないといけなかったような気がするが...変わったのかなぁ)
>sftp 接続先のアドレス >put no-passphrase-key.pub >exit >ssh 接続先のアドレス >cat no-passphrase-key.pub >>.ssh/authorized-keys >chmod 600 .ssh/authorized-keys
秘密鍵を用いてアクセス
別のマシンからサーバにアクセスする。 秘密鍵のパスが標準でない($HOME/.ssh/id_rsa、$HOME/.ssh/id_dsa)でない場合、 sshでは-iオプション、sftpでは-oIdentityFileオプションを用いて指定する
>ssh -i private-key username@hostname >sftp -oIdentityFile=private-key username@hostname
.ssh/config ファイル
.ssh/configを書いておくと、sshライフがとっても便利になる。
例えば、次のコマンドで接続するリモートホストがあったとして、
> ssh remote_user@192.168.1.200
次の設定を書いておくと 、
Host remote01-px
HostName 192.168.1.200
User remote_user
次のコマンドで接続できる様になる。
> ssh remote01-px
しかも、bash環境だとbash-completion をインストールしておくと configファイルのHostの設定値を補完をしてくれる。
また、別のマシンをプロキシとして経由してリモートホストに接続することもできる。
設定例は次の通り。
Host remote01-px
HostName 192.168.1.200
User remote_user
Host remote01-px
HostName 192.168.1.100
User remote_account
Host *-px
ProxyCommand ssh proxy@192.168.1.100 nc %h %p
ポートフォワーディング
任意の通信を暗号化できる便利な機能
NATネットワーク内にある端末を外部から操作する
NATネットワーク内にある端末に外部から接続するにはNAT越え問題が発生する。
例えば管理サーバから、NATルータ配下の端末にsshで接続したい場合など。
ポートフォワードを応用すると端末側の協力が必要であるが、外部からNAT内の端末にsshで接続できる。 NAT内の端末から次の様にコマンドしてもらえれば、外部の端末はlocalhost:任意のポート に接続することで NAT内の端末にログインできる。
ssh -R 任意のポート:localhost:22 外部ホストのユーザ名@外部ホストのアドレス
例)端末側 remote.hogehoge.comというホスト名の外部ホストからNAT内の端末にアクセスしたい場合
ssh -R 10022:localhost:22 remote-user@remote.hogehoge.com #1 ssh local-user@127.0.0.1 -p 10022 #2
まず、NATの内の端末から#1の様に接続してもらう。
次に#2の様に remote.hogehoge.comから 127.0.0.1:10022 に接続する。
トラブルシューティング
接続に失敗する
次のエラーが出てSSHが接続できない場合、/etc/hosts.allowおよび/etc/hosts.denyの設定の可能性がある。従ってこれらのファイルの編集が必要。
hosts.allowにsshdへのアクセスを許可するような設定をすれば解決するかも。詳しくはHosts.allowとhosts.deny
ssh_exchange_identification: Connection closed by remote host
接続が遅い
SSHでリモートホストに接続する際、パスワードを聞かれるまでが長い場合、リモートホストにUseDNSが設定されていない場合がある。この設定はデフォルトでyesとなっている。
この設定がyesとなっていると、接続の際IPアドレスからリモートホスト名を逆引き検索して、それをさらに正引きして、同じIPアドレスになるかを確認する。
特にローカルネットワークでDNSが無い場合等は無駄な設定なので次のようにnoを設定するとよい。
UseDNS no
Host key verification failed. というエラーがでて接続できない
リモートホストの OS 再インストールなどにより, 公開鍵が以前のものと変わってしまうことがある. その場合は Host key verification failed. と言われて接続できなくなる。
相手側のサーバが不正に変更されていないことを確認できれば、次のコマンドで~/.ssh/known_hostに記録されているエントリーを削除できる。 削除後はなじめて接続したときと同じ確認が再度あり、接続できるようになる。
> ssh-keygen -R <ホスト名>