リモートホスト間操作

複数のサーバーを運用する場合、両者間の通信は欠かせないものとなります。
更新日 2016-02-13

SSH によるリモート端末接続

リモートでコンソール端末に接続する際に、telnet ではなくSSH というセキュアな接続を行います。Windows で動く クライアントソフトとしてPutty やTeraTerm が有名です。TeraTerm に馴染みぶかく、近年SSH2 やUTF8 にも対応して いるので、こちらの利用を推奨します。

SSH2 によるRSA 暗号方式での接続

通常のユーザー名とパスワードによる識別は、端末を限定しないという点でセキュリティ上の問題が常に生じます。 そこで公開鍵を用いた認証方法が用意されました。SSH1 とRSA 認証、SSH2 とDSA 認証、SSH2 とRSA 認証の三通りが ありますが、いろいろな点を考慮した際にもっともお勧めなのがSSH2 とRSA 認証だそうです。

RSA 認証の仕組み

鍵の作成と配置

ログインしたいサーバーに移り、ssh-keygen を用いて公開鍵と秘密鍵を作ります。途中でパスフレーズを 聞かれます。パスフレーズはパスワードみたいなものでssh で接続する際に問われます。但しパスワードと違って 本認証処理に使用される訳ではなく、単にパスフレーズ入力コストをユーザーに強いるだけを目的としています。 逆にいえばパスフレーズを省略する事でcron 等でも使えるセキュアでパスワードを求められないSSH 接続とする 事ができます。
ssh-keygen Generating public/private rsa key pair.
 Enter file in which to save the key (/root/.ssh/id_rsa):  // ここで保存先があれば入力 Enter passphrase (empty for no passphrase):  // パスフレーズを入力(省略可) Enter same passphrase again:  // パスフレーズn再入力 Your identification has been saved in /root/.ssh/id_rsa.
 Your public key has been saved in /root/.ssh/id_rsa.pub.
 The key fingerprint is:
 a5:07:23:a9:a8:83:1d:f4:14:dc:a4:12:22:b8:a4:d8 root@lobin
メッセージの通り公開鍵(.pub が付いている方)と秘密鍵ができてるか 確認します。ついで公開鍵を~/.ssh/authorized_keys に追加します。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
これでサーバー側に公開鍵が準備されました。次に秘密鍵をログインを許可するクライアントマシンに 転送しておきます。秘密鍵はssh で接続する時に必要になります。一般的にid_rsa というファイル名で クライアント側の~/.ssh 以下に置きますが、別名でどこにおいてもssh を実行する時にフルパスで指定 すれば良いだけで問題はありません。(~/.ssh/id_rsa はデフォルトとしてssh 実行時に勝手に参照 してくれるというメリットはありますが)
秘密鍵を転送し終えたらサーバーからは削除しておきましょう。authorized_keys に追加した公開鍵も 同様に消します。なお秘密鍵も属性を600 にしておきます。

サーバー側 /etc/ssh/sshd_config を編集

サーバー側で動いているsshd デーモンの設定を行います。/etc/ssh/sshd_config を編集し、RSAAuthentication を 有効にし、PasswordAuthentication を無効にします。(パスワード認証はRSA 認証が正しく行える事を確認してから オフにしても構いません。リモートで不意にログインできなくなると面倒ですから)
CentOS6 ではこの編集作業は不要なようです。.ssh ディレクトリがあれば参照するようになってます。
vi /etc/ssh/sshd_config

 //SSH protocol version 2 を使う
 Protocol 2

 // Listen port (IPV4)
 ListenAddress 0.0.0.0

 // RSA 認証を行う
 RSAAuthentication yes

 // 
 #PubkeyAuthentication yes
 #AuthorizedKeysFile     .ssh/authorized_keys
 PasswordAuthentication no


// 編集が終わったらsshd デーモンを再起動しておきます。
service sshd restart

接続テスト

クライアントマシンから接続してみます。サーバーで作成した秘密鍵がクライアントに~/.ssh/id_rsa という ファイルで保存されていれば通常通りのssh サーバーアドレスで接続できます。
ssh 192.168.1.2

// 秘密鍵を別名で保存している場合は指定します。
ssh -i /cdrv/lobin_rsa 192.168.1.2
パスフレーズを省略していれば、全く入力の手間無くログインできる事が確認できます。
// rsync の例
rsync -avz --delete -e "ssh" 192.168.1.2:/home/lobin/* /home/lobin/
もしくは
rsync -avz --delete -e "ssh -i /cdrv/lobin_rsa" 192.168.1.2:/home/lobin/* /home/lobin/
Permission denied (publickey,gssapi-with-mic).
といったエラーが出る場合、秘密鍵の属性が600 でない、もしくはid_rsa.pub を消し忘れている 可能性があります。SELinux がオンになっているとPermission denied と弾かれます。

TeraTerm 経由でのファイル送受信

zmodem プロトコルで簡単なファイルのやりとりが可能です。
// 受信待機([メニュー] ファイル → 転送 → ZMODEM → 送信)
rz

// 送信([メニュー] ファイル → 転送 → ZMODEM → 受信)
sz test.txt

// CentOS では必要
yum install lrzsz

ポート転送

SSH で接続した先にポート転送を行えます。具体的にはlocalhost の任意のポートをフックし、SSH 接続先のLAN 内の任意のアドレス・ポートに向けて転送できます。
SSH 転送で設定します。

scp によるコピー

scp はcp コマンドをssh 経由で行えるようにしたものです。cp コマンドのイメージで使えます。ssh なのでパスワードを求められます。

使い方

ssh を経由する際のユーザー名を付けます。
// 192.168.1.3 にあるファイル/home/www/index.html をコピー
scp root@192.168.1.3:/home/www/index.html /home/www/

// ファイル /home/www/* を192.168.1.4 の/home/www にコピー
scp /home/www/* root:192.168.1.4:/home/www

rsync による同期

同じWeb サイトを複数のサーバー運用するケースがあります。重にトラフィックの分散が目的だったりする訳ですが、必然的に それぞれのサーバーにコンテンツを配置しなければなりません。コンテンツ更新の際には、複数のサーバーにFTP アップロード しなければならなくなります。
この負担を減らす為にFTP サーバーを一つ限定し、各リモートホスト間でミラーリングコピーを自動的に行わせるのが吉です。 rsync というコマンドを使います。タイムスタンプによる比較や圧縮も組み合わせられる為、転送コストは少なくて済みます。 ssh を使う為、セキュリティもあります。

rsync の使い方

rsync -e "ssh" -avz --delete 192.168.1.2:/home/ast/ /home/ast/

ssh のパスフレーズを省略する

パスフレーズの入力が手動ではrsync を定期的に実行させるには不都合となります。そこでパスフレーズを省略する方法を 取ります。
// マスター側sshd_config
HostbasedAuthentication yes
RhostsAuthentication no
IgnoreRhosts no

// スレーブ側sshd_config
HostbasedAuthentication yes
PreferredAuthentications hostbased,publickey,password

NFS による共有

linux 同士のフォルダ共有であればNFS (Network File System) を使うのが便利です。

共有したいディレクトリを公開する(NFS サーバー側)

/etc/exports を編集して、共有としたいディレクトリのフルパスを記述します。アクセス制限も行えます。
vi /etc/exports

 # /ddrv を公開し、LAN 内からの接続に限り許可する
 /ddrv   192.168.23.0/255.255.255.0(rw)
iptables の設定を行うため、NFS で使用するポートを固定する。
vi /etc/sysconfig/nfs

 // ポートを指定(デフォルト値で上手くいかない場合は下記で)
 LOCKD_TCPPORT=2052
 LOCKD_UDPPORT=2052
 MOUNTD_PORT=2050
 STATD_PORT=2051
続いてiptables に上記のポートを通す設定を行います。
vi /etc/sysconfig/iptables

 // 追加
 -A RH-Firewall-1-INPUT -s 192.168.23.0/255.255.255.0 -p tcp -m state --state NEW
  -m tcp -m multiport --dports 111,2049,2050,2051,2052 -j ACCEPT
 -A RH-Firewall-1-INPUT -s 192.168.23.0/255.255.255.0 -p udp -m state --state NEW
  -m udp -m multiport --dports 111,2050,2052 -j ACCEPT

 // 下記のREJECT の直前に上の二行を挿入する
 // -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited


// 設定反映の為に再起動
service iptables restart
// NFS サーバーを起動
service portmap start
service nfslock start
service nfs start

// 問題なければ成功

共有ディレクトリをmount する(クライアント)

// マウント用ディレクトリを作成しておく
mkdir /mnt/ddrv

// マウント 相手先のIPアドレス(例: 192.168.23.3)
mount -t nfs 192.168.23.3:/ddrv  /mnt/ddrv
NFS はサーバーがダウンしたりすると道連れになるようなので、 使う時だけ自動でマウントしてくれるautofs が便利です
yum install autofs

vi /etc/auto.misc

 // 末尾に追加 
 cdrv  -fstype=nfs  192.168.23.3:/cdrv

chkconfig autofs on
service autofs start

// マウントされたか確認できればOK
cd /misc/cdrv