○ ssh-agent (openssh)

・ssh接続で、ログインのたびにパスフレーズを入力しないですむ環境をつくる
・CentOS 6.x ではX起動時にssh-agent環境を立ち上げる設定になっています
・クライアントのsshはrpmパッケージのopensshを使います
・"protocol2 PubkeyAuthentication"を使います
・鍵の作製は opensshクライアント を参照してください
・ログアウトするまでssh-agent環境が維持されるので注意

・gnome(GUI)ではgnome-keyringがssh-agentに類似した働きをします
・gnome-keyringは、CUI環境や仮想ターミナルでは使えません

・ログイン端末で "#" はroot、"$" は一般ユーザのプロンプトの記号です
・設定ファイルで "#" で始まる行はコメントとして解釈されます

○参照ファイル

:opensshマニュアル etc.
opensshクライアント

○仮設定

:ローカルホスト  mars.528p.com
:ユーザ sola
:サーバ venus.528p.com
:ユーザ sola
:サーバ earth.528p.com
:ユーザ sola



○ssh-agentの設定

・CentOS 6.x ではXの起動セッションでssh-agentを読み込みますが
・実際には起動されません、ログイン後 psコマンドで確認しましょう

:/etc/X11/xinit/xinitrc-common
:/etc/X11/xinit/Xsession

○gnome-keylingのsshチェックを止める

・CentOS6ではgnome-keyringのsshチェックが有効になっています
・gnome-keylingは、ssh-agentよりも優先されるので無効にします

gnome-keyringのssh設定

システムツール → 設定エディタ を起動します
apps/gnome-keyling/daemon-componentesを開きます
sshのチェックを外します
次回ログイン後から無効になります

・CentOS 7.x ではxdgのautostartでgnome-keyringのsshを設定します
・無効にするには、リネームしましょう

[root@mars:~]
# cd /etc/xdg/autostart
[root@mars:/etc/xdg/autostart]
# mv gnome-keyring-ssh.desktop gnome-keyring-ssh.desktop.orig

○~/.profileを読み込む

:/etc/X11/xinit/xinitrc-common

・GUI(gnome)ログイン時に.profileを読み込む設定をします
・クライアントにssh(sftp,scp)接続された場合に
・".bashrc"が読み込まれてエラーがでることがあります
・/etc/X11/xinit/xinitrc-commonを修正します
紫色部分 を追記します

・省略

  . /etc/profile.d/lang.sh
fi
 
[ -r $HOME/.profile ] && . $HOME/.profile

userresources=$HOME/.Xresources
usermodmap=$HOME/.Xmodmap
userxkbmap=$HOME/.Xkbmap

・省略


○~/.profileの設定

:/home/sola/.profile

・".profile"に起動設定をし、GUIログイン時にssh-agentを起動させます
・ssh-agentが起動していたらssh-agent環境変数だけ読込む設定です
・秘密鍵はsshコマンド(bash関数)の実行時に読込むように設定します

# .profile

・省略

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# ssh-agent set and ssh command functions

agent_alive=0

if ps -C ssh-agent u | grep ${USER} 2>&1 1>/dev/null; then
    echo ## ssh_agent alive
    agent_alive=1
fi

if [ $agent_alive -eq 0 ]; then
    ssh-agent | sed 's/^echo/#echo/' > "$HOME/.ssh/agent_env"
    chmod 600 "$HOME/.ssh/agent_env"
fi

source "$HOME/.ssh/agent_env"

# clear console output (if you need it)

#echo -ne '\e[H\e[2J'

・省略

・変数が設定されているか確認

[sola@mars:~]
$ echo $SSH_AGENT_PID
4138
$ echo $SSH_AUTH_SOCK
/tmp/ssh-bWPqTA4137/agent.4137

○ssh-agentの解除

:/etc/gdm/PostSession/Default

・GUIログアウト時にssh-agentを止めます
・"selinux"が"enforceing"の場合、制御されることがあります
・"PostSession"で.gdm_logoutを読み込みます

#!/bin/sh
if [ -e /home/${USER}/.gdm_logout ] ; then
   su - ${USER} -c /home/${USER}/.gdm_logout
fi
exit 0;

:/home/sora/.gdm_logout (sola sola 700)

・chmod u+x ~/.gdm_logout で実行権限を与えておく

SSHA_PID=$(ps x |awk '/ssh-agent/ && !/awk/ {print $1}')
[ -z "$SSHA_PID" ] || kill -TERM $SSHA_PID

○ssh-agentに秘密鍵を追加します

・ssh-agentによって保持されるのは、ユーザ認証用の秘密鍵です

・ssh-agentに秘密鍵を追加

$ ssh-add

・ssh-agentによって保持されているすべての鍵の指紋(fingerprint) を表示

$ ssh-add -l

・ssh-agentによって保持されているすべての鍵の情報を表示

$ ssh-add -L

・ssh-agentからデフォルトの鍵を取り除く

$ ssh-add -d

・ssh-agentからすべての鍵を取り除く

$ ssh-add -D



○ssh-agentを利用したssh接続スクリプト

・秘密鍵を最初に登録しておけば2回目以降はパスフレーズを入力しないですみます
・スクリプトで秘密鍵の登録(bash関数)とsshコマンド(bash関数)の簡素化をします
・サーバ上でのコマンドの実行 (-tオプション)、sshログインを組みこんでいます

:/home/sola/bin/ssh-connect.sh (sola sola 700)

#!/bin/bash

if ! ssh-add -l > /dev/null 2>&1; then
	ssh-add
fi

HOST=`basename $0`
DOMAIN=`hostname -d`

case $1 in
    root)
        case $2 in
            -s)
                sftp -o Protocol=2 root\@$HOST.$DOMAIN ;;
            -t)
                shift
                shift
                ssh -2 -t root\@$HOST.$DOMAIN $* ;;
             *)
                shift
                ssh -2 root\@$HOST.$DOMAIN $* ;;
        esac ;;
    -s)
        sftp -o Protocol=2 $USER\@$HOST.$DOMAIN ;;
    *)
        ssh -2 $USER\@$HOST.$DOMAIN $* ;;
esac

exit

○/home/sola/binにパスを通します

:/home/sola/.bash_profile

・省略

PATH=$PATH:$HOME/bin
export PATH

・省略


○/home/sola/binディレクトリにhost名のリンクをつくります

$ cd bin
[sola@mars:~/bin]
$ ln -s ssh-connect.sh venus
$ ln -s ssh-connect.sh earth

○host名にスクリプト引数を指定して実行します

$ cd ~
[sola@mars:~]

・Ctrl+Cキーの必要なコマンドをroot権限で実行します

$ venus root -t top

・一般コマンドをroot権限で実行します

$ venus root ls -a

・rootでログインします

$ venus root

・rootでsftpで接続します

$ venus root -s

・一般ユーザでログインします

$ venus

・一般ユーザでsftpで接続します

$ venus -s

○サーバ間の移動

・各サーバの ~/.ssh/config (ユーザごとの設定) を修正します
・出発点のクライアントの ~/.ssh/config (ユーザごとの設定) も修正します

ForwardAgent yes

・サーバ間で移動してみる (各サーバは同じ公開鍵を使用)
・venusにはスクリプトがないのでsshコマンドを実行

[sola@mars:~]
$ venus
[sola@venus:~]
$ ssh earth
[sola@earth:~]
$

○ Copyright(c) 528p.com All Rights Reserved.