Edit
OpenSSH

Edit
Install

# wget http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-5.4p1.tar.gz
# tar zxvf openssh-5.4p1.tar.gz
# cd openssh-5.4p1
# ./configure --with-ssl-dir=/usr/local/ssl
# make
# make install

Edit
セキュリティ対策

ログインされるサーバーのユーザーフォルダに、暗号鍵(公開鍵)を置いておいて、ログインされるときに、パスワードを入力する方式ではなく、公開鍵方式を利用して、ログイン専用のパスフレーズ認証を行うことで、クライアントからの接続を制限します。

Edit
暗号鍵の作成

サーバーに遠隔ログインしたいユーザー名でまずログインし、暗号鍵(公開鍵と秘密鍵)などの作成を行います。(クライアント側で作成してもよいのですが、コピーが面倒なので)

# cd ~/.ssh                               <- 自分のホームディレクトリ
# ssh-keygen -t rsa -b 4096              <- 作成するキーがrsa(ssh2)タイプ
 Enter passphrase :                       <- 自分だけのパスフェーズを入力
 Enter same passphrase again :            <- 再入力

パスフレーズ無しの場合

# ssh-keygen -N "" -t rsa -b 4096

※出来上がった、id_rsa.pubファイルと.sshフォルダの権限設定も行う事。.ssh ディレクトリー(0700)、id_rsa.pubキーファイル(0644)にする。ここの設定ミスはエラー表示されない!(ちなみに公開キーid_rsa.pubの方をサーバーに設置して、秘密キーをクライアントに設置する)

パスフレーズ削除

# openssl rsa -in [パスワード付秘密鍵] -out [パスワード無し秘密鍵]

Edit
クライアントの設定

先ほど作成した、id_rsa と id_dsa という秘密キーをクライアントにコピーして、SSHソフトに読み込ませる。(それぞれのツールのやり方にしたがってください)
具体的なPuttyのScpを利用したサーバーからのファイルコピー(Windows)

# pscp.exe -scp root@192.168.0.105:/root/.ssh/id_* .

scp利用したコピーなどの時に、.bashrc や /etc/bashrc などに、"stty stop undef"などの1行が入っていると、'stty: standard input: Invalid argument'などのエラーが発生するので外しておく

クライアント側のソフトには、有名なPuttyを紹介しておきます。インストールがいらずに、.exeファイルだけで稼動する優れものです。ほかにも日本語で便利なのは Tera termという優秀なソフトがあります。
Putty HopePage
Putty の場合の設定方法
UTF Teara Term の場合の設定方法

Edit
ログイン

ログイン時は、アカウントの入力の後、サーバーのパスワードではなく、パスフェーズ(暗号を作成するときに利用したパスフェーズです)を入力してログインします。

Edit
sshdの設定ファイルの設定

OpenSSHをソースレベルからインストールした場合には、/usr/local/etc/sshd_configの設定ファイルを変更しますが、通常は以下のとおり。(yum でインストールすると、/etc/ssh/sshd_config となる)

# cd /etc/ssh
# emacs sshd_config
MaxAuthTries 1                     <- パスワードのミスの受付回数
RSAAuthentication no               <- RSA ver1認証をNGに
PubkeyAuthentication yes           <- 証明書をOKに(下で指定するファイルを有効にする)
AuthorizedKeysFile  .ssh/id_dsa    <- キーファイル名を指定
PermitEmptyPasswords no            <- パスワード無しログインを禁止
PasswordAuthentication no          <- パスワードログイン禁止
PermitRootLogin no                 <- Root Loginを可能にするか
MaxStartups 1                    <- 最大接続待機数

※ちなみに、MaxStartups 1:50:3 と指定すると1接続を超えると50%の確立で接続失敗、3接続以降は100%失敗という設定になる。

Edit
Logファイルの確認

sshdはシステムメッセージとしてLogファイルに出力されますので、/var/log/secure の中に一緒に出力されます。
通常立ち上げ時に設定しなければ、sshd_conf ファイルの中で設定されます。

# emacs /etc/ssh/sshd_conf
  SyslogFacility AUTHPRIV
  LogLevel INFO

このFacility値というのは、ログメッセージの種類を表します。
通常はこのレベルですが、

  SyslogFacility LOCAL5
  LogLevel VERBOSE

このように指定すると、かなり詳細のLogが出力されます。

Edit
syslog関係

Syslogd は、CentOSの大部分のログを管理します。通常は、/etc/syslog.conf の設定内容に従って、ログをFacility毎にファイルに分けます。ログの設定などを修正した場合には、

Edit
lastコマンド

/var/log にbtmp,wtmpというログイン履歴ファイルが作成されます。

# last                      <- ログインできた履歴をみます。
# lastb                     <- ログイン出来なかった履歴をみます。

※まれに、sshd がbtmpへの履歴更新時にファイルが権限エラーで書き込めない時があります。以下の所有者をwtmpと同じ権限に変更しておくとエラーはでなくなります。

# chown sshd:sshd /var/log/btmp
# chmod --reference=/var/log/wtmp /var/log/btmp

Edit
moduliファイルについて

インストール時に /etc/ssh/moduli ファイルが作られない場合がある。(OpenSSLのバージョンによるようだ、詳細は未調査)場合によっては、/etc/moduliとして作成されるため、以下のコマンドで移動しておくとよい。

# cp /etc/moduli /etc/ssh/

または

# cp /etc/ssh_back/moduli /etc/ssh/

Edit
SSHを利用した簡単トンネリング(VPN)

sshが起動しているパソコンを通じて、外部のパソコンが内部ネットワークにアクセスすることが可能。OpenVPNなどの専用ソフトを入れることなく簡単に導入できる。定義されているRFC4254

Edit
設定

sshdデーモンの設定ファイルである、/etc/ssh/sshd_config の主要な設定は以下の通り。

# vi /etc/ssh/sshd_config
  PermitTunnel point-to-point
  AllowTcpForwarding yes
ssh -v -w0:0 server
-wクライアント側のインターフェイス番号:サーバ側のインターフェイス番号

Edit
カーネルによるIPルーティングを許可する場合

# vi /etc/sysctl.conf
 net.ipv4.ip_forward = 1               <- 1にするとfowardingする。0はしない。

すでにOSが起動している状態の時はProcを直接操作することでIP転送をONにできる。

# echo 1 > /proc/sys/net/ipv4/ip_forward

Edit
利用方法

Edit
Windowsから

WindowsからはPuttyを利用するのが簡単である。設定項目は「接続」->「SSH」->「トンネル」に設定すれば、ローカルにアクセスするようにSSHサーバーが設置されているセグメントのPCに接続できる。

源ポート:127.0.0.1:3390          <- 自分のIPとポート(トンネルするポート、以下a-port)を指定。
送り先ポート:ssh.server.com:11111  <- 使っていないポートを入り口にしてあげないと、接続先のPCからa-portでパケットを吐けない。

また「ローカルポートは他のPCからの接続を受け付ける」のチェックをつけると、ルーターとして自分のPCが繋がっているセグメントから、SSHサーバーが繋がっているセグメントに設定したポートのフォワーディングを行う。「リモートポートも同様(SSH-2のみ)」はその反対の動作を行う。

Edit
Linuxから

基本的な利用はsshクライアントで接続させておくことで利用できる。

# ssh hostA -L 11111:hostB:5432 -N

Edit
接続の仕組み

以下の例はpostgresではなくVNC(ポートは5900番のアプリ)サーバーに接続する例。Linuxのsshクライアントに渡すコマンドは以下の通り。

# ssh sshサーバIP -L 11111:vncサーバIP:5900 -N
ssh_vnc.png
  1. 自分自身のポートの11111番にアクセスをする。すでに上記コマンドによりsshクライアントが11111番ポートを確保しているので、このポートを通じて、sshクライアントに接続される。
  2. SSHクライアントが22番ポート(通常時)を使ったトンネルを通り、SSHサーバに接続
  3. 暗号化された22番ポートを通してSSHサーバに届いたデータは、ポートフォワード先と指定した、vncサーバIPへ5900番ポートに変更して接続。(これによりVNCサーバに特別な設定なく同一セグメント内のマシンのようにアクセスできている)
  4. vncサーバからSSHサーバへレスポンス
  5. 再度暗号化されたSSHの22番ポートを利用したトンネルを通り、クライアントへ帰る
  6. 自分自身からレスポンスが返ってくる

Edit
認識の注意点

sshによるトンネリングはあくまで、遠隔地のsshサーバが通常接続しているセグメント上にあるPCの「特定」ポートに対して、ポートフォワーディングを行う技術であり、VPNのようなIPをルーティングするわけではないので、複数のPCの複数のポートにフォワーディングしようとすると、必要な分だけのsshクライアントを立ち上げ、sshクライアントの窓口ポートをその必要数分確保する必要があるため、ネットワークとネットワークを繋げるような場合には、VPNを利用するべき。あくまで、遠隔地の1つのサーバの中の1つのアプリに接続したい場合など、sshが動いていれば気軽に利用開始できることがポイント。

Edit
ssh(クライアントソフト)

Edit
sshのユーザ別定義ファイル(.ssh/config)の利点

  1. $HOME/.ssh/は600なのでオプションを覗かれる心配がない。
  2. psコマンドでsshのオプションの見える心配がない。

Edit
sshの多段アクセス(ProxyCommand型)

.ssh/configを利用することで、多段先にあるsshに単純なホスト名をつけるだけでアクセスできるため、rsync+ssh などのファイルコピーが非常に楽になる。

[rsync+ssh(HostA)] -> [sshd(hostB)] -> [sshd[HostC] -> [sshd[HostD]

上記の構成で、HostAはHostDのフォルダをコピーしたいとき。

# vi config
 Host HostB
      HostName     HostB
      User         user_b
      Port         10022
      ProxyCommand ssh HostC nc -w 10
 Host HostC
      HostName     HostC
      User         user_c
      Port         11022
      ProxyCommand ssh HostD nc -w 10
 Host HostD
      HostName     HostD
      User         user_d
      Port         11122

Edit
sshのDynamicForward機能

DynamicForward機能とは、SOCKSを利用したポートPorxy機能を指す。

Host *-proxy
      DynamicForward 1080

Edit
関連リンク

Edit
トラブルシューティング

証明書を利用した接続時は、下記の3つのポイントをチェックすれば大概解決する。

Edit
エラー:Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

Permission denied (publickey)などのエラーが出て接続できない。

  1. sshd_config のAllowUsersの設定に接続するユーザー名が登録されていない。
  2. リモート側の.sshディレクトリのPermissionが700になっていない。
  3. リモート側の公開鍵ファイルのPermissionも600になっていない。
  4. クライアント側の秘密鍵フォルダのPermissionが700になっていない。(未確認)
  5. クライアント側の秘密鍵ファイルのPermissionが600になっていない。

Edit
エラー: No supported authentication methods available(sshdのログ)

通常、SELinuxに引っかかっている場合が多いので、セキュリティコンテキストの初期化をすることで解決する。

# /sbin/restorecon -r /root/.ssh

これでも治らない場合には、SELinuxの設定(/etc/selinux/targeted/contexts/files/file_contexts)を見直し、下記のように修正又は追加する。

/root/\.ssh(/.*)?   system_u:object_r:ssh_home_t:s0

それでも治らない場合は、SELinux をOFFにしてみる。(当然ながらセキュリティ低下)

# setenforce 0

Edit
Server refused our keyが出る。

接続先の、sshでログインするユーザーのホームディレクトが、755 になっていない。(よく777にして繋がらない事が多い)

Edit
参考

暗号化と署名は対称じゃないよという話
sshd_conf の設定について

Edit
Server LOG

現在のサーバのlog

添付ファイル: filedns.id_dsa 581件 [詳細] fileid_rsa 534件 [詳細] filedns.id_dsa.ppk 539件 [詳細] fileauthorized_keys 549件 [詳細] filessh_vnc.png 1297件 [詳細] fileid_dsa 495件 [詳細]