Powered by SmartDoc

SSH

SSHとは

SSHはSecure SHellの略で、ネットワーク上の他のホストへ遠隔ログインを実現するサービスで、通信データを暗号化することで安全な通信を実現する。認証には公開鍵暗号を使いログインデータを暗号化し、通信の暗号化には共通鍵暗号を使いより安全な通信を実現できる。

SSHはポート22を使っているのでファイアウォールを有効にしている場合はこのポートが解放されているかを確認すること。

多くのディストリビューションではにはOpenSSH(1)が導入されている。

  1. http://wwww.openssh.com/ja/

OpenSSHのインストールとアップデート

自分の使っているLinuxにOpenSSHがインストールされているかを確認し、インストールされていないときはインストールする。また、最新のパッケージにアップデートする。学内でインストールするときは/etc/yum.confか環境変数http_proxyを設定しておく。

OpenSSHがインストール確認、インストール、アップデート
# rpm -q openssh
# yum install openssh
# yum check-update openssh
# yum update openssh

サーバの起動制御

SSHサーバプログラムは/usr/sbin/sshdで、サービスとして起動される。サーバやクライアントの設定ファイルはディレクトリ/etc/sshにあり、/etc/ssh/sshd_configがサーバ設定ファイルである。

SSHサーバを手動で起動・停止・再起動を制御するには/etc/init.d/sshdスクリプトあるいはserviceコマンドを使う。これらの操作は管理者権限で実行する。

それぞれの使用例を以下に示す。

/etc/init.d/sshdで起動・停止・再起動
# /etc/init.d/sshd start  <- 起動
# /etc/init.d/sshd stop  <- 停止
# /etc/init.d/sshd restart  <- 再起動
serviceコマンドで起動・停止・再起動
# service sshd start  <- 起動
# service sshd stop  <- 停止
# service shd restart  <- 再起動

SSHサーバは設定を変更しなくても動作する。この状態ではサーバ接続時にパスワードの入力が必要である。

SSHクライアント

SSHのコマンドにはssh、scp、sftp、ssh-keygen等がある。

sshシェル

クライアントはsshを使い、サーバへアクセスし、コマンドライン引数にはサーバ名やユーザ名を指定し、サーバにログインする。

例えば、IPアドレス192.168.1.100のSSHサーバへクライアントにログインしているユーザでログインするときはコマンドを次のように入力する。

sshでサーバにログイン
$ ssh 192.168.1.100

また、クライアントにログインしているユーザとは異なるユーザでログインする場合はユーザ名をサーバ名の前に指定する。例えば、上記サーバ(192.169.1.100)にユーザnobitaでログインするときはコマンドを次のように入力する。

ログインユーザtokoとなるユーザでのログイン
$ ssh nobita@192.168.1.100

初めてサーバへログインすると次のようなホストへの認証が証明できないといったメッセージと接続を続けるかと問われるのでyesと入力し、RSAキーをカレントディレクトリの.ssh/known_hostsファイルに保存させる。二回目以降の接続ではこのメッセージは表示されない。

初回アクセス時のメッセージ
$ ssh 192.168.1.89
The authenticity of host '192.168.1.89 (192.168.1.89)' can't be \
    established.
RSA key fingerprint is \
    ac:25:14:49:e3:60:73:70:93:76:f9:2a:4f:dc:d7:e7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.89' (RSA) to the list of \
    known hosts.
sakabe@192.168.1.89's password: 

scpによるファイルコピー

scpはsshを使ったリモートホストへのファイルコピーのコマンドで、その引数にはローカルファイル、リモートファイル、ホスト名を指定する。

例えば、カレントディレクトリのファイルtest.txtをIPアドレス192.168.1.100のサーバの自分のホームディレクトリにコピーおよび、ファイルtest1.txtをtest11.txtという名前でカレントディレクトリにコピーするときは図4.4.2.1[サーバのホームおよびサーバからのファイルのコピー]のコマンドを入力する。

サーバのホームおよびサーバからのファイルのコピー
$ scp test.txt 192.168.1.100:
$ scp 192.168.1.100:test1.txt test11.txt

別ユーザでコピーする場合はサーバ名の前にユーザ名をsshシェルと同じ要領で付加する。

rootでのログインを無効にする

OpenSSH導入後の初期設定ではrootでサーバに直接ログインを許可しており、セキュリティ上好ましくない。rootでの直接ログインを無効にするには設定ファイル/etc/ssh/sshd_configの設定項目PermitRootLoginの値をnoに変更すればよい。

rootでの直接ログインを拒否する設定
# PermitRootLogin yes <- 変更前
PermitRootLogin no    <- 変更後

設定ファイルを編集し保存したら図4.5.1[設定ファイルの再読込]のいずれかのコマンドでサーバに設定を再読込させる。

設定ファイルの再読込
# /etc/init.d/sshd reload
# service sshd reload

この設定以降rootでログインを試みても許可がないと警告され、ログインできなくなっているはずである。

rootでのログインを拒否
$ ssh root@192.168.1.89
root@192.168.1.89's password: 
Permission denied, please try again.

公開鍵暗号を使った、より安全なSSH

SSHサーバの初期設定ではパスワードを使ってログインだが、これに代わって公開鍵暗号を使い、より安全なログインを実現できる。

公開鍵暗号を使うためには公開鍵と秘密鍵の二つを作り、公開鍵をサーバに、秘密鍵をクライアントに設置する。

設定作業手順

公開鍵暗号を使うための設定手順は次の通り。なお、【ク】はクライアント側、【サ】はサーバ側での作業を意味する。

  1. 【ク】ssh-keygenコマンドで公開鍵と秘密鍵を作る。
  2. 【ク】生成された公開鍵のファイルをサーバにコピーする。
  3. 【ク】サーバにログインする。
  4. 【サ】ホームディレクトリにディレクトリ.sshを作る。
  5. 【サ】クライアントから転送した公開鍵のファイルをディレクトリ.sshにauthorized_keysという名前で移動する。
  6. 【サ】ディレクトリ.sshとファイルauthorized_keysのパーミッションを700と600に変更する。
  7. 【サ】SSHの設定ファイルを編集し、SSHサーバへのパスワードによるログインを無効にする。
  8. 【サ】SSHサーバに設定ファイルを再読込させる。

公開鍵暗号の生成とサーバへのコピー、設定の変更

2つの鍵はコマンドssh-keygenを使って作る(図4.6.2.1[ssh-keygenの使用例])。コマンドの引数で暗号方式のDSAあるいはRSAを指定する。

ssh-keygenの使用例
$ ssh-keygen -t dsa
$ ssh-keygen -t rsa1
$ ssh-keygen -t rsa2

このコマンドを実行するとディレクトリ~/.sshに各暗号鍵のファイルが作成されが、ファイル名の末尾にpubが末尾に付くファイルが公開鍵を保存している。

生成された公開鍵のファイルはサーバの~/.sshにauthorized_keysという名前でコピーする。ディレクトリ~/.ssh、ファイルauthorized_keysのパーミッションをそれぞれ700と600に変更し、他のユーザが読めないようにしておく。

設定ファイル/etc/ssh/sshd_configでパスワードによるログインを無効にする設定(リスト4.6.2.1[パスワードでのログインを無効にする])をし、公開鍵暗号を使った接続に変更する。

パスワードでのログインを無効にする
PasswordAuthentication no

図4.6.2.2[公開鍵の転送]に暗号方式をDSA、サーバを192.168.1.100、パスワード入力を省略した時の操作例を示す。

公開鍵の転送
$ scp ~/.ssh/id_dsa.pub 192.168.1.100:
$ ssh 192.168.1.100
$ mkdir .ssh
$ cp id_dsa.pub ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
$ sudo vi /etc/ssh/sshd_config
$ sudo /etc/init.d/sshd reload

リモートコマンドを実行

SSHシェルを使えばリモートホストでコマンドを実行させ、その結果をクライアントで表示できる。例えば、IPアドレス192.168.11.10のサーバでpsコマンドを実行するときのコマンドは図4.7.1[リモートコマンドの実行例]のように入力する。

リモートコマンドの実行例
$ ssh 192.168.11.10 ps ax  

TCP Wrapperを使い、サーバへのアクセスを制限

更により高い安全性を実現するためにTCP Wrapperを使い、SSHサーバへのアクセスを制限できる。TCP Wrapperはアクセス許可を/etc/hosts.allowに、アクセス拒否を/etc/hosts.denyに記す。

これらのファイルの書式は次の通り。

/etc/hosts.allowと/etc/hosts.denyの書式
サービス名: ホスト名またはIPアドレス

例えば、IPアドレス192.168.1.50以外のホストからのアクセスを拒否するにはこの二つのファイルは次のように記述する。設定を変更した時点からアクセス制限が適用される。

/etc/hosts.allow
sshd: 192.168.1.50
/etc/hosts.deny
ALL: ALL

ログイン時にメッセージを表示

SSHでログインしたときにメッセージを表示させられる。表示させるメッセージは/etc/motdに記しておく。viなどのテキストエディタでこのファイルを編集すればよい。

X11での接続

SSHを使いX11アプリケーションのウィンドウを表示させることができる。SSHサーバの設定でX11での接続に関わる設定を下記のように変更する。

/etc/ssh/sshd_configでX11を利用する設定
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

SSHに設定を反映させたら、Xオプションを付けてサーバにアクセスする。

X11を利用する
$ ssh -X 192.168.1.100
$ xeyes &

実習項目

以下の各項目について実習せよ。

  1. 自分のLinuxでSSHサーバを起動し、確認用のPCから遠隔ログインできるかを確認する。
  2. 公開鍵暗号を使ったより安全なSSHによる遠隔ログインを実現する。
  3. SSHサーバに接続したときにメッセージを表示させる。
  4. 特定のホスト以外からのアクセスを拒否するよに設定する。/etc/hosts.allowと/etc/hosts.deny
  5. SSHデーモンの起動、停止、再起動等の操作をGUIおよび、コマンドで実行する方法を示せ。
  6. SSHサーバへrootでログインできないようにする方法を示せ。
  7. X11アプリケーションを実行する方法を示せ。
  8. scpを使って実習用サーバPCにファイルをコピーする。適当なテキストファイルを作り、実習用サーバPCの各自のホームディレクトリにコピーする。