ssh周りについて記録
sshで接続元、接続先が信頼できる場合にパスワードなしでログインできるように設定してみる
この方法はバックアップなどで応用できる
ポイントは公開鍵と秘密鍵を利用すること
公開鍵と秘密鍵はキーファイル作成時にファイル名ペアなども記憶しているため後で後からファイル名変更しても有効にならない
前提条件
接続元 | 公開鍵と秘密鍵生成 |
接続元 | 接続アカウント名:admin |
接続先 | 接続アカウント名:admin |
接続先 | ディレクトリ:/backup |
$ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/admin/.ssh/id_dsa):/home/admin/.ssh/backup【enter】 Created directory '/home/admin/.ssh'. Enter passphrase (empty for no passphrase):【enter】 Enter same passphrase again:【enter】 Your identification has been saved in /home/admin/.ssh/backup. Your public key has been saved in /home/admin/.ssh/backup.pub. The key fingerprint is: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx admin@<host名> $
$ scp ~admin/.ssh/backup.pub admin@<接続先ホスト名>:/home/admin/
su - admin $ mkdir .ssh $ chmod 700 .ssh $ cd .ssh $ cat ../backup.pub > authorized_keys2 $ chmod 600 authorized_keys2 $ exit
$ su - # mkdir /backup # chown admin: /backup
接続元からテストしてみる
[admin@<接続元>] $ ssh -l admin -i <秘密鍵ファイル> <接続先> [admin@<接続先>] $ ←パスワードなしでsshログインできた
接続元から転送テストしてみる
$ rsync -avHR -e "ssh -i /home/admin/.ssh/backup" /home/admin admin@<接続先>:/backup上手くいけばパスワードなしでファイル転送ができる
公開鍵認証のみでssh接続を受け付ける
この設定を施すことでパスワード文字列だけではなく、鍵を保有しておかないとssh接続ができないようになりセキュリティ面では安全強度が増す。鍵がなければログインできない…
設定方法はパスワードなし認証とほぼ同じ。sshdの設定を変更する部分が異なる。
# vi /etc/ssh/sshd_config PasswordAuthentication no←追加orコメントアウトを外す # service sshd restart
# ssh <接続先> -l <接続ユーザ名> -i <秘密鍵ファイル> →接続できるはず # ssh <接続先> -l <接続ユーザ名> →接続できない。Permission deniedと怒られる
WinSCPで接続する場合はOpenSSL形式の秘密鍵が利用できないのでWinSCPに付属のPuTTY KeyGenツールを利用してPuTTY形式に変換する
~/.ssh/authorized_keysは規定のファイル名で、var1のRSA認証かvar2の公開鍵認証を受け付ける。
一行に一つのキーを記述して、空の行と#で始まる行は無視される。 protocol version 2ではkeytypeとして“ssh-dss”か“ssh-rsa”となる。 protocol version 2のフィールドはスペース区切りで、options、keytype、base64エンコードキー、コメントとなる。 optionsフィールドは省略可能。 各行は8キロバイトが最大長となる。 DSAキーは8キロビット、RSAキーは16キロビットまでを許可する。 sshdは最小キーサイズを768ビットとしている。
optionsフィールドは、カンマ区切り。ダブルクォートを除いた空白は許可されない。
from=“pattern-list” | カンマ区切りでリモートホスト名を記述、*や?も利用可能。先頭に!をつけて否定の意味にできる。 |
---|---|
command=“command” | 接続した際に指定されたコマンドのみを実行する |
environment=“NAME=value” | |
no-port-forwarding | |
no-X11-forwarding | |
no-agent-forwarding | |
no-pty | |
permitopen=“host:port” | |
tunnel=“n” |
sshのリバース機能?と鍵認証を使うとこんな事ができたりする
この任意のスクリプトが終了するまでの間は、接続元で9999ポートが開く。ここにsshで接続すると接続元端末の22番ポートにトンネルされている事が確認できる
sshdのChrootDirectoryを利用してsftp接続してきたユーザにChroot環境を提供する
環境はSL6でやりました。
OpenSSH-Serverは5.3p1-70ですね。
まずsshdの設定。最小値です。
# vi /etc/ssh/sshd_config Subsystem sftp internal-sftp #←sftp-serverから内蔵sftpに変更する Match Group sftponly PasswordAuthentication yes ChrootDirectory /home/%u
そして、対象ユーザを作成。その前にグループを作成しときます。
このsftponlyグループに属しているユーザだけ、sshd_configに追記したMatchディレクティブに係ってChrootする仕組み。
Chrootするディレクトリは所有者がrootで、かつ、所有者以外に書込み権限がないのが条件です。
# groupadd -g sftponly # useradd -M userA # gpasswd -a userA sftponly # mkdir -p /home/userA/writeOK # chown userA: /home/userA/writeOK # chmod 755 /home/userA/writeOK # chmod 755 /home/userA
これで、userAでsftpすると/home/userAにChrootされる。
writeOKのディレクトリは所有者がuserAで755なので、書込みOK。
/home/userAは所有者がrootで755なので、読込しかできないし、ディレクトリも作成できない。
こんな感じか!