がらくたネット


SSH周り

SSH周り

ssh周りについて記録

パスワードなしで接続する設定

sshで接続元、接続先が信頼できる場合にパスワードなしでログインできるように設定してみる
この方法はバックアップなどで応用できる
ポイントは公開鍵と秘密鍵を利用すること
公開鍵と秘密鍵はキーファイル作成時にファイル名ペアなども記憶しているため後で後からファイル名変更しても有効にならない

前提条件

接続元公開鍵と秘密鍵生成
接続元接続アカウント名:admin
接続先接続アカウント名:admin
接続先ディレクトリ:/backup
  1. 接続元で鍵生成
    $ 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名>
    $
  2. 公開鍵を接続先へ転送
    $ scp ~admin/.ssh/backup.pub admin@<接続先ホスト名>:/home/admin/
  3. 接続先で登録処理
    su - admin
    $ mkdir .ssh
    $ chmod 700 .ssh
    $ cd .ssh
    $ cat ../backup.pub > authorized_keys2
    $ chmod 600 authorized_keys2
    $ exit
  4. 接続先でバックアップディレクトリ作成
    $ 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接続ができないようになりセキュリティ面では安全強度が増す。鍵がなければログインできない…:-x

設定方法はパスワードなし認証とほぼ同じ。sshdの設定を変更する部分が異なる。

  • 接続元で鍵生成
  • 接続先に公開鍵を転送
  • 接続先で公開鍵を登録
  • 接続先sshサーバー設定の変更
    # vi /etc/ssh/sshd_config
    PasswordAuthentication no←追加orコメントアウトを外す
    # service sshd restart
  •  確認する
    # ssh <接続先> -l <接続ユーザ名> -i <秘密鍵ファイル>
    →接続できるはず
    # ssh <接続先> -l <接続ユーザ名>
    →接続できない。Permission deniedと怒られる

WinSCPで接続する場合はOpenSSL形式の秘密鍵が利用できないのでWinSCPに付属のPuTTY KeyGenツールを利用してPuTTY形式に変換する

AuthorizedKeysFileについて

~/.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のリバース機能?と鍵認証を使うとこんな事ができたりする

  • 接続元で秘密鍵と公開鍵を生成
  • 公開鍵を接続先のauthorized_keysに登録
  • 登録したauthorized_keysにcommand行で任意のスクリプトを指定
  • 接続先に登録した任意のスクリプトを作成
  • 接続元から接続先に秘密鍵を指定して接続すると接続先の任意のスクリプトが実行されて終了。このときsshコマンドに-R 9999:127.0.0.1:22を指定する

この任意のスクリプトが終了するまでの間は、接続元で9999ポートが開く。ここにsshで接続すると接続元端末の22番ポートにトンネルされている事が確認できる

sftpでchroot

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なので、読込しかできないし、ディレクトリも作成できない。

こんな感じか!

/home/userAをシンボリックリンクとして全く別のディレクトリを指し示しても動いたッス~