実践Linux
CentOS5/6.5        CentOS5/6.5 目次へ  TOP(HOME)へ

SSHサーバー(CentOS5の場合)  2011年8月更新





解説書より
「SSHの暗号通信は、公開鍵暗号(RSAやDSA)を用いて共通鍵暗号(トリプルDES、AESなど)の共通鍵を暗号化して鍵交換を行い、通信自体は高速な共通鍵暗号を用いる、いわゆるハイブリッド暗号である。また、なりすましを防止するための認証の仕組みも充実している。パスワード認証、公開鍵認証、ワンタイムパスワードなどが提供されており、個々の情報セキュリティポリシーに合わせて選択できる。」

CentOS5にはopenSSHがインストール済み。

●SSH設定ファイル
/etc/ssh/sshd_config
 PasswordAuthentication no ← 通常パスワードでのログインを禁止(鍵方式によるログインのみ許可) 59行目
 また、PAMが使用可能になっている場合はPAMのチャレンジ・レスポンス認証がパスワード認証と同じ機能をもっているため、通常パスワード認証を禁止するときはかならずChallengeResponseAuthenticationもnoを指定しておくこと。
 ChallengeResponseAuthentication no  63行目

 rootログインを禁止する場合
 PermitRootLogin no  39行目

●パケットフィルタリング(iptables)
 22/TCPを開ける。

●/etc/hosts.allow
 sshdを許可。

●SSHセキュリティ対策
不正なアタックが立て続けに行われることへの対処。
/etc/ssh/sshd_config編集
 MaxStartups 2:80:5  ←111行目
2つまでの接続要求を受け付け、これを超えると80%の確率で接続要求を拒否し、5つを超えるとすべて拒否。
編集後は、sshd の再起動が必要。

だが、現実的には、sshdの待ち受けポート番号をデフォルトの22番ではなく別な番号に変えてしまうだけで、不正なアクセスは解決する場合が多い。

Windows SSHクライアントPuttyの導入
●日本語表示のパッチがあてられたものを入手する。
http://hp.vector.co.jp/authors/VA024651/PuTTYkj.html
puttygen.exe(秘密キー、公開キーの生成・変換ツール)、pageant.exe(認証エージェント)も同梱されている。

●鍵セットの作成(windowsクライアント側で作成する方法)
puttygen.exeを実行。
SSH2 RSA暗号が選択されていることを確認して、Generateボタンを押す。
途中でランダムシード作成のためマウスを動かすように促されるのでマウスを動かし続ける。
パスフレーズを入力する。(2カ所同じパスワードを入力)
Save public keyボタン、Save private keyボタンを押して、それぞれ公開キーと秘密キーを保存する。(分かりやすくkeyフォルダを作成して保存とよい。)
ここではputty_rsa.pub、secret.ppk名で保存したとする。

●linuxサーバーへの公開キー登録
公開キーputty_rsa.pubをlinuxサーバーにコピー。
これをopenSSHが使用可能な形式に変換する。(ここではputty.pub名で変換するとする。)
# ssh-keygen -i -f putty_rsa.pub > putty.pub
変換した公開キーをSSH接続したいユーザーの~/.ssh/authorized_keysファイルに登録する。
ここではuser01に登録。
$ mkdir /home/user01/.ssh
$ cat putty.pub >> /home/user01/.ssh/authorized_keys
$ chmod 644 /home/user01/.ssh/authorized_keys
authorized_keysファイルには複数の公開キーを登録することができる。

●通常のSSH接続をやってみる
puttyjp.exeを実行。
セッション  接続先のIPアドレス 333.333.333.210 ポート22 プロトコルSSH
接続→SSH→認証  プライベート鍵の場所を指定(ここではsecret.ppk)
ウィンドウ→変換  文字コードの設定 UTF-8を指定
セッションに戻り以上の設定を保存しておくと次回接続から便利。
「開く」で接続開始。
セキュリティアラートは「はい」を選択。
接続ユーザー名(ここではuser01)と鍵のパスフレーズの入力。
サーバーのターミナルが開く。


ポートフォワディング(トンネル接続)
SSHは単なる telnet などの代わりではなく、SSHの真価はトンネルにある。これを使うと、様々なネットワークアプリケーションの通信を、SSHの暗号回線の中に入れて送受信することが可能となる。

      トンネル
      SSH暗号通信                平文通信
localhost ――――――→  SSHサーバー(A) ――――――→  ***サーバー(B)
                  333.333.333.210    192.168.7.1          192.168.7.100
  ポート1111       ポート22                   ポート2222

localマシンの1111番ポート接続を、****サーバーの2222番ポートに転送(ポートフォワーディング)する。
localhostとhostAの間は SSH で保護され、hostAとhostBの間は保護されない。
***サーバー側では、 iptables等、SSHサーバーからの2222アクセスを許可するようにしておく。

●linuxクライアント
$ ssh -N -L 1111:hostB:2222 hostA
ここで言う hostBは 、hostA から見たときの hostB であることに注意。
SSHサーバーと接続先ホストが同一の場合は、hostBにはlocalhostまたは127.0.0.1と記述する(グローバルアドレスや内部LANアドレスにしてもうまく動作しないので注意)。
-L オプションは複数指定できるので、同じ SSH サーバ を経由する接続でありさえすれば、一回の認証で複数本のトンネルを張ることができる。

●windowsクライアント(PuTTY)
トンネルの設定
上記「通常のSSH接続」に次の設定を加えてやる。
接続→SSH→トンネル
 源ポート  1111
 送り先   192.168.7.100:2222 (SSHサーバーから見た***サーバーを指定。SSHサーバーと接続先ホストが同一の場合は、localhost:2222または127.0.0.1:2222と記述する。)
 「ローカル」がチェックされていることを確認。
 追加ボタン。
この設定もセッションに戻り保存しておくとよい。

「開く」でトンネル接続開始。
接続ユーザーと鍵のパスフレーズの入力。
サーバーのターミナルが開く。

複数の****サーバーへ接続したい場合にはローカルのポートを変えて行う(1111、1112)。
  L1111 192.168.7.100:2222
  L1112 192.168.7.200:2222

●アプリケーションの設定
****サーバーから見ると、ユーザーは SSHサーバーからアクセスしているように見えるが、一方、アクセスするアプリケーション側は、自分のマシンを****サーバーとして設定する必要がある。つまり、アプリケーションにはアクセスする****サーバーとして自分自身localhost:1111を指定する=自分自身を****サーバーと見立ててポート1111に送るとSSHトンネルを通して本物の****サーバー(ポート2222)に届くことになる。


●postgreSQLの例
1.postgreSQLクライアントは自分自身にアクセスをする
2.SSHのトンネルを通り、SSHサーバへアクセス
3.ポートフォワードで設定したpostgreSQLへSSHからアクセス
4.postgreSQLがSSHサーバーへレスポンス
5.SSHのトンネルを通り、クライアントへ帰る
6.自分自身からレスポンスが返ってくる

@上記「通常のSSH接続」に次の設定を加えてやる。
接続→SSH→トンネル
 源ポート  1234 (適当に)
 送り先   192.168.7.100:5432 (SSHサーバーから見たpostgreSQLサーバー)
        SSHサーバーとpostgreSQLサーバーが同一の場合は、127.0.0.1:5432と記述する。
 「ローカル」がチェックされていることを確認。
 追加ボタン。
この設定もセッションに戻り保存しておくとよい。

「開く」でトンネル接続開始。
接続ユーザーと鍵のパスフレーズの入力。
サーバーのターミナルが開く。

Aexcel等からの接続
SERVER=localhost;PORT=1234を指定(自分自身を指定)。

※ postgreSQLサーバー側では、SSHサーバーに対してポート5432/TCPを開けておく。(SSHサーバーとpostgreSQLサーバーが同一の場合は、localhostからの接続扱いとなる。)また、/var/lib/pgsql/data/pg_hba.confの設定も同様。


●sambaの場合
【WindowsXP】
Windowsクライアントは既に139番ポートを使っているので、そのままでは転送できません。そこでループバックデバイス(WindowsにはMicrosoft Loopback Adapterというループバックデバイスが用意されています)を使い、そのポートとサーバ側のポートを繋ぐことで使えるようになります。
・ハードウェアの追加でMicrosoft Loopback Adapterを追加
・Microsoft Loopback AdapterにIP: 169.254.xxx.1, Netmask: 255.255.0.0を設定
・PortForwarderやPuTTYなどで169.254.xxx.1の139番ポートを転送するように設定

仮想ネットワークインターフェースMicrosoft Loopback Adapterのインストール
現在使用しているネットワークインターフェースとは別に、転送元となるためのネットワークインターフェースを用意します。物理的なインターフェースを増設する必要はなく、仮想的なインターフェースを用意します.
・コントロールパネルを開きます.
・ハードウエアの追加を開きます.
・「次へ」を押します.
・「はい、ハードウエアを接続しています」を選択して次へいきます.
・一番下の「新しいハードウエアの追加」を選択して次へいきます.
・「一覧から選択したハードウエアをインストールする(詳細)」を選択して次へいきます.
・「ネットワーク アダプタ」を選択して次へいきます.
・「Microsoft」と「Microsoft Loopback Adaptor」を選択して次へいきます.
・インストールが完了するまで続行します.

Microsoft Loopback Adaptorの設定
・インストールが終わったら,ネットワーク→プロパティ(vistaはさらに →ネットワーク接続の管理).
・デバイス名が「Microsoft Loopback Adaptor」であるアイコンを探します.
・プロパティを開き,全般のタブで,「Microsoft ネットワーク用ファイルとプリンタ共有」のチェックを外します.
・「インターネットプロトコル(TCP/IP)」のチェックは入れたまま,選択し,プロパティを押します.
・他のマシンと重ならない IP アドレスとサブネットマスクを入力します.
プライベートアドレスや LINKLOCAL アドレス (169.254.*.*) のアドレス範囲を使うことになります.今後は 169.254.0.1/255.255.0.0 と設定した場合の例として説明します. ゲートウェイ,DNS の項目を入力する必要はありません.
・「詳細設定」を開きます. 「WINS」のタブで「NetBIOS over TCP/IP を無効にする」を選択します.
・それぞれ OK で決定して閉じます.

「詳細設定」→「IP 設定」タブ→「IP アドレス」で,さらに IP アドレスを追加できるので,それらも転送元にすることにより,複数拠点の Samba を同時に使うこともできます.

あとはPuTTYを使ってポートフォワードするだけです。
(「接続」→「SSH」→)「トンネル」を選択します。
源ポートに「169.254.0.1:139」、送り先に「127.0.0.1:139」(SSHサーバーから見た送り先。ここでは同一の場合。)と入力し、「ローカル」にチェックが入っていることを確認して、追加を押します。

【Windows Vista】
vistaの場合は、源ポート「169.254.0.1:445」、送り先「127.0.0.1:445」。
なお、vista用パッチ(KB94262)があてられていると445ポートのフォワーディングが無効になってしまいアクセスできなくなります。
解決策は、http://www.sshvpn.de/のLocalSMB.exeをダウンロードし、管理者権限(右クリック)で実行。PCを再起動するとアクセスできるようになります。

SSH接続ができたら、「ネットワーク」を開いて「\\169.254.0.1」を入力。

【Windows7】
Loopback Adapterのインストール
 コンピュータを右クリックしてプロパティからデバイスマネージャ―を選択します。
 「操作」→「レガシーハードウェアの追加」→「次へ」。
 「一覧から選択」を選び、「次へ」を押します。
 「ネットワークアダプター」を選択して、「次へ」を押します。
 「製造元」−「Microsoft」 「ネットワークアダプター」Microsoft KM-TEST LoopBack Adapter」を選択。
Loopback Adapterの設定
 ネットワーク/プロパティ→アダプタの設定変更
 「Microsoft Loopback Adaptor」のプロパティ
 ネットワークのタブで,「Microsoft ネットワーク用ファイルとプリンタ共有」のチェックを外します。
 「インターネットプロトコルバージョン4(TCP/IPv4)」のチェック以外はすべてはずし、TCP/IPv4のプロパティを押します。
  (結局、「インターネットプロトコルバージョン4(TCP/IPv4)」だけチェックされた状態となる。)
 169.254.0.1/255.255.0.0 を設定。ゲートウェイ、DNS の項目を入力する必要はありません。
 「詳細設定」を開きます。「WINS」のタブで「NetBIOS over TCP/IP を無効にする」を選択します。
 それぞれ OK で決定して閉じます。
仮想NIC上で445ポートを使用できるようにする
 LocalSMB.exeをダウンロードする。
 LocalSMB.exeを管理者権限(右クリック)で実行させ、「Disable local CIFS/SMB」にチェックを入れる。
 成功した旨のポップアップを確認した後、クライアントPCを再起動させる。
PuTTY 源ポート「169.254.0.1:445」、送り先「127.0.0.1:445」。


SSHクライアントからデータのやりとり
●基本的にはsshのscpコマンド(sshコピーコマンド)を使用する。
クライアント→サーバー
$ scp [オプション] パス名(ファイル名) [ユーザー@]ホスト名:[パス名]
$ scp book.html book.pdf user01@ns1.my-dom.xxx:  book.htmlとbook.pdfをサーバーのホームディレクトリに転送する。
$ scp -r -q mail/ user01@ns1.my-dom.xxx:work/  mail/ディレクトリ全体をサーバーのホームディレクトリ上にあるwork/ディレクトリ内に転送する。

サーバー→クライアント
$ scp [オプション] [ユーザー@]ホスト名:パス名 パス名
$ scp user01@ns1.my-dom.xxx:/home/user01/cgi-bin/test.cgi .  サーバー上の/home/user01/cgi-bin/test.cgiファイルをカレントディレクトリに転送する。

オプション
-q 進捗を表示しない(quiet)
-r ディレクトリを再帰的に転送(recursive)
-p 転送元ファイルの情報(更新日時、パーミッション)を反映(preserve)

●windowsではwinSCPというソフトを使用  http://winscp.net/eng/download.php
設定例
ホスト 333.333.333.210
ポート 22
ユーザー名 user01
パスワード 空白のまま(公開鍵方式のときは空白、共通鍵方式のとき使用)
プライベートキーの場所 puttyで作成した.ppkファイルを指定
プロトコル SCP または SFTP(SCP代替システムを許可)
日本語文字化け対策 詳細設定をチェックし→環境 ファイル名をUTF-8でエンコード
                             「自動」を「オン」に変更。明示的にUTF-8にする。
「save」ボタンで保存しておくとよい。
「login」ボタンで接続。
秘密キーのパスフレーズを入力。

ポートフォアディング
      SSH暗号通信
localhost ――――――→  ns1 ――――――→  linux
            333.333.333.210   192.168.7.1       192.168.7.100

192.168.7.100のSSH設定
/etc/ssh/sshd_config
 PasswordAuthentication yes ← 通常パスワードでのログインを許可

パケットフィルタリング(iptables)
 192.168.7.1に対して22/TCPを開ける。

/etc/hosts.allow
 192.168.7.1に対してsshdを許可。

winSCP設定
ホスト 192.168.7.100
ポート 22
ユーザー名 scpuser
パスワード 192.168.7.100のscpuserのlinuxパスワード
プライベートキーの場所  空白のまま
プロトコル SCP または SFTP(SCP代替システムを許可)
日本語文字化け対策 詳細設定をチェックし→環境 ファイル名をUTF-8でエンコード
                             「自動」を「オン」に変更。明示的にUTF-8にする。

詳細設定をチェックし→トンネル
「SSHトンネルを経由して接続」をチェック
ホスト 333.333.333.210
ポート 22
ユーザー名 user01
パスワード 空白のまま
プライベートキーの場所  333.333.333.210のuser01に設置した公開キーとペアの.ppkファイルを指定


chroot機能の導入
デフォルトのままの設定だと、サーバ上の読み込み権があるファイルが丸見えになる。
SFTPアクセスだけに制限。
かつユーザに制限をかけて、ホームディレクトリ以外のアクセスを許さない。


これらを実現するためには、chroot機能を使うとよいが、CentOSで準備されているOpenSSHはバージョンが古くchroot機能が含まれていない。本家からソースを入手して再インストールしてやる必要がある。

最新のOpenSSHをインストール
@OpenSSHを新規にインストールするため、既にインストールされてSSHをアンインストール
SSHサーバー停止。
openssh関連パッケージアンインストール。
 # yum -y remove openssh

ASSHサーバーインストール
本家からソースを入手してRPMパッケージを作成してインストールする。

インストールに必要なもの OpenSSL、zlib、Tcp Wrapper、pam
確認 # yum list installed | grep ssl等(sslをzlib、tcp、pamに入れ替えて確認)
インストールされてない場合は、インストールしておく。

ダウンロード
http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-5.5p1.tar.gzをダウンロード
適当なディレクトリに展開

openssh-5.5p1/contrib以下のRedHat以外のディレクトリを削除(ディレクトリのみ、ファイルはそのまま)

openssh-5.5p1/contrib/redhat/openssh.specファイル編集
 # Do we want to disable building of x11-askpass? (1=yes 0=no)
 %define no_x11_askpass 0 → 1   x11_askpassの無効化  12行目

 # Do we want to disable building of gnome-askpass? (1=yes 0=no)
 %define no_gnome_askpass 0 → 1   gnome_askpassの無効化  15行目

 #%if ! %{skip_x11_askpass}  ←コメントアウト 77行目
 Source1: http://www.jmknoble.net/software/x11-ssh-askpass/x11-ssh-askpass-%{aversion}.tar.gz
 #%endif  ←コメントアウト
 (CentOS5ではこれをやっておかないとRPMパッケージ作成でエラーが出る。)

 %configure \  191行目
 --without-zlib-version-check \ ← 追加(zlibのバージョンチェック無効化)
 --sysconfdir=%{_sysconfdir}/ssh \

openssh展開ディレクトリ再圧縮
 # tar czvf openssh-5.5p1.tar.gz openssh-5.5p1/ (元のopenssh-5.5p1.tar.gzは別の場所に待避させておく。)

RPMパッケージ作成
 # rpmbuild -tb --clean openssh-5.5p1.tar.gz

作成したRPMパッケージをインストール
 # rpm -Uvh /usr/src/redhat/RPMS/i386/openssh-5.5p1-1.i386.rpm
 # rpm -Uvh /usr/src/redhat/RPMS/i386/openssh-server-5.5p1-1.i386.rpm
 # rpm -Uvh /usr/src/redhat/RPMS/i386/openssh-clients-5.5p1-1.i386.rpm
 # rpm -Uvh /usr/src/redhat/RPMS/i386/openssh-debuginfo-5.5p1-1.i386.rpm

作成したRPM(/usr/src/redhat/RPMS/i386/openssh-*)、ダウンロードしたファイル、展開したディレクトリ等を削除(必要に応じて)。

BSSHサーバー起動スクリプト修正
※SSHサーバー起動時に以下のワーニングメッセージ(Starting sshd:WARNING: initlog is deprecated and will be removed in a future release)が出力されることの対処

/etc/rc.d/init.d/sshdの修正
 start()
 {
 # Create keys if necessary
 do_rsa1_keygen
 do_rsa_keygen
 do_dsa_keygen

 echo -n $"Starting $prog:"
 #initlog -c "$SSHD $OPTIONS" && success || failure ← 行頭に#を追加してコメントアウト
 $SSHD $OPTIONS && success || failure ← 追加
 RETVAL=$?
 [ "$RETVAL" = 0 ] && touch /var/lock/subsys/sshd
 echo
 }

CSSH設定ファイル/etc/ssh/sshd_configの編集
PasswordAuthentication no  59行目
MaxStartups 2:80:5  103行目

DSSHサーバー起動

chrootの設定
@sftponlyというグループを作成する。
 # groupadd sftponly

Aユーザを作成する
例としてuser1というユーザを作成。
 # useradd user1
 # passwd user1
プライマリグループはsftponly、ログインシェルは/sbin/nologin

B作成したユーザのホームディレクトリの整備
 # chmod 755 /home/user1

ここにpublic_html、cgi-bin等必要なディレクトリ、ファイルがあればあらかじめ作成しておく。(後に、# chown root:root /home/user1を実行したとき、ホームディレクトリ直下には書き込み等ができなくなるので。)
rootで作業しているので、所有者を変更しておく。
 # chown -R user1:sftponly /home/user1

C鍵の設置
~/.sshディレクトリを作って鍵を登録する。
rootで作業しているので、所有者を変更しておく。
 # chown -R user1:sftponly /home/user1

Dsshd_configの編集。
デフォルトだとsftpで接続されたときにはsftp-serverが接続を担当しますが、sshdの内部のものを使うように指定します。 111行目
 #Subsystem sftp /usr/local/libexec/sftp-server
 Subsystem sftp internal-sftp

認証されたユーザがsftponlyグループの場合、ChrootDirectoryを実施、同時にsftpだけを許可するようにもします。sshd_configの最後に以下の行を追加。
 Match group sftponly
  ChrootDirectory /home/%u  %u は認証したユーザの名前に展開されます。
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp

sshdを再起動。

E最終調整
ここではSSH内部のsftpを使用する設定にしたので、shellなどをコピーする必要はない。
ホームディレクトリの所有者をrootにしておく。そうでないと接続できない。
 # chown root:root /home/user1



TOP(HOME)へ

目 次

特別企画
Raspberry Piで遊ぶ

HOME(全体のシステム構成&目次)

CentOS7
CentOS7のインストール〜ネットワークの設定ほか
CentOS7の新機能(systemdとfirewalld)
ダイレクトルールを使ったfirewallの強化
DNS(BIND)サーバー
Webサーバー
  Webでファイルの受け渡し
  アクセス解析ツールAwstats
  Wordpressでブログ構築
FTPサーバー
FTPS(FTP over SSL/TLS)
Mail(Dovecot&Postfix)サーバー
Sambaサーバー
MariaDB(MySQL)サーバー
DHCPサーバー
SSHサーバー
VNCサーバー
ストリーミングサーバーRed5
ドメインの追加

CentOS5〜6
ネットワーク&ファイアウォール(iptables)
DNS(BIND)サーバー
DHCPサーバー
メールサーバー(基本)
メールサーバー/実際の運用
Webサーバー
  WebDAVによるファイル共有
  Webでファイルのやり取り
  アクセス解析ツールawstats
  namazuで全文検索
  WordPressブログサイト構築
  EC-CUBEショッピングサイト構築
FTPサーバー
ファイルサーバー・Samba
データベースpostgreSQL
  ExcelからpostgreSQLを操作
データベースMySQL
SSHサーバー
VNC
SSL/TLSを利用した暗号化通信
openVPN
ストリーミングサーバー
    C++ RTMP Server
    Helix server Basic
ドメインの追加
Xen・仮想化
特定ディレクトリに容量制限

SELinux
SELinux基本設定
新しいタイプとポリシー・モジュールを作成してみる
マクロを利用したteファイルの記述
新しいドメインを導入してみる

coLinux
Fedora11で試す

Cプログラミング目次
X11プログラム
サイエンス・プログラム

計測・プログラム
秋月電子のデーターロガーpico ADC-16
「今すぐ使えるパソコン計測USBマイコン基板」に付属のTRZ1102
センサーの使用例

Glade2/GTK+を使ってみる
テキスト・ビューで簡易エディター
ドローイングエリアで自動描画
放物線運動(pango、cairoも試してみる)
これらを、GTK+のみで書き出す

フォントについて
ネットワーク・プログラミング
postgreSQL接続
CGI
ファイル操作

●その他
印刷機関連開発 刷版絵柄面積率測定
数独をExcelで解く