# 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
ログインされるサーバーのユーザーフォルダに、暗号鍵(公開鍵)を置いておいて、ログインされるときに、パスワードを入力する方式ではなく、公開鍵方式を利用して、ログイン専用のパスフレーズ認証を行うことで、クライアントからの接続を制限します。
サーバーに遠隔ログインしたいユーザー名でまずログインし、暗号鍵(公開鍵と秘密鍵)などの作成を行います。(クライアント側で作成してもよいのですが、コピーが面倒なので)
# 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 [パスワード無し秘密鍵]
先ほど作成した、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 の場合の設定方法
ログイン時は、アカウントの入力の後、サーバーのパスワードではなく、パスフェーズ(暗号を作成するときに利用したパスフェーズです)を入力してログインします。
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%失敗という設定になる。
sshdはシステムメッセージとしてLogファイルに出力されますので、/var/log/secure の中に一緒に出力されます。
通常立ち上げ時に設定しなければ、sshd_conf ファイルの中で設定されます。
# emacs /etc/ssh/sshd_conf SyslogFacility AUTHPRIV LogLevel INFO
このFacility値というのは、ログメッセージの種類を表します。
通常はこのレベルですが、
SyslogFacility LOCAL5 LogLevel VERBOSE
このように指定すると、かなり詳細のLogが出力されます。
Syslogd は、CentOSの大部分のログを管理します。通常は、/etc/syslog.conf の設定内容に従って、ログをFacility毎にファイルに分けます。ログの設定などを修正した場合には、
/var/log にbtmp,wtmpというログイン履歴ファイルが作成されます。
# last <- ログインできた履歴をみます。 # lastb <- ログイン出来なかった履歴をみます。
※まれに、sshd がbtmpへの履歴更新時にファイルが権限エラーで書き込めない時があります。以下の所有者をwtmpと同じ権限に変更しておくとエラーはでなくなります。
# chown sshd:sshd /var/log/btmp # chmod --reference=/var/log/wtmp /var/log/btmp
インストール時に /etc/ssh/moduli ファイルが作られない場合がある。(OpenSSLのバージョンによるようだ、詳細は未調査)場合によっては、/etc/moduliとして作成されるため、以下のコマンドで移動しておくとよい。
# cp /etc/moduli /etc/ssh/
または
# cp /etc/ssh_back/moduli /etc/ssh/
sshが起動しているパソコンを通じて、外部のパソコンが内部ネットワークにアクセスすることが可能。OpenVPNなどの専用ソフトを入れることなく簡単に導入できる。定義されているRFC4254
sshdデーモンの設定ファイルである、/etc/ssh/sshd_config の主要な設定は以下の通り。
# vi /etc/ssh/sshd_config PermitTunnel point-to-point AllowTcpForwarding yes
ssh -v -w0:0 server -wクライアント側のインターフェイス番号:サーバ側のインターフェイス番号
# vi /etc/sysctl.conf net.ipv4.ip_forward = 1 <- 1にするとfowardingする。0はしない。
すでにOSが起動している状態の時はProcを直接操作することでIP転送をONにできる。
# echo 1 > /proc/sys/net/ipv4/ip_forward
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のみ)」はその反対の動作を行う。
基本的な利用はsshクライアントで接続させておくことで利用できる。
# ssh hostA -L 11111:hostB:5432 -N
以下の例はpostgresではなくVNC(ポートは5900番のアプリ)サーバーに接続する例。Linuxのsshクライアントに渡すコマンドは以下の通り。
# ssh sshサーバIP -L 11111:vncサーバIP:5900 -N
sshによるトンネリングはあくまで、遠隔地のsshサーバが通常接続しているセグメント上にあるPCの「特定」ポートに対して、ポートフォワーディングを行う技術であり、VPNのようなIPをルーティングするわけではないので、複数のPCの複数のポートにフォワーディングしようとすると、必要な分だけのsshクライアントを立ち上げ、sshクライアントの窓口ポートをその必要数分確保する必要があるため、ネットワークとネットワークを繋げるような場合には、VPNを利用するべき。あくまで、遠隔地の1つのサーバの中の1つのアプリに接続したい場合など、sshが動いていれば気軽に利用開始できることがポイント。
.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
DynamicForward機能とは、SOCKSを利用したポートPorxy機能を指す。
Host *-proxy DynamicForward 1080
証明書を利用した接続時は、下記の3つのポイントをチェックすれば大概解決する。
Permission denied (publickey)などのエラーが出て接続できない。
通常、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
接続先の、sshでログインするユーザーのホームディレクトが、755 になっていない。(よく777にして繋がらない事が多い)
暗号化と署名は対称じゃないよという話
sshd_conf の設定について