リモートホスト間操作
複数のサーバーを運用する場合、両者間の通信は欠かせないものとなります。
更新日 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 にしておきます。
秘密鍵を転送し終えたらサーバーからは削除しておきましょう。authorized_keys に追加した公開鍵も 同様に消します。なお秘密鍵も属性を600 にしておきます。
サーバー側 /etc/ssh/sshd_config を編集
サーバー側で動いているsshd デーモンの設定を行います。/etc/ssh/sshd_config を編集し、RSAAuthentication を
有効にし、PasswordAuthentication を無効にします。(パスワード認証はRSA 認証が正しく行える事を確認してから
オフにしても構いません。リモートで不意にログインできなくなると面倒ですから)
CentOS6 ではこの編集作業は不要なようです。.ssh ディレクトリがあれば参照するようになってます。
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 と弾かれます。
といったエラーが出る場合、秘密鍵の属性が600 でない、もしくはid_rsa.pub を消し忘れている 可能性があります。SELinux がオンになっているとPermission denied と弾かれます。
TeraTerm 経由でのファイル送受信
zmodem プロトコルで簡単なファイルのやりとりが可能です。
// 受信待機([メニュー] ファイル → 転送 → ZMODEM → 送信)
rz
// 送信([メニュー] ファイル → 転送 → ZMODEM → 受信)
sz test.txt
// CentOS では必要
yum install lrzsz
ポート転送
SSH で接続した先にポート転送を行えます。具体的にはlocalhost の任意のポートをフックし、SSH 接続先のLAN 内の任意のアドレス・ポートに向けて転送できます。
SSH 転送で設定します。
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 を使う為、セキュリティもあります。
この負担を減らす為に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