このページではLinuxサーバーパソコンからリモート操作するためのsshdの設定ファイルsshd_configの編集方法について初心者向けに解説します。
お便利サーバー.com+相互リンクサイト内をキーワードで検索
NTP SSH DHCPサーバーの構築

NTPサーバーについて

ntpdの設定(WBEL3,CentOS3)

ntpdの設定(WBEL4,CentOS4)

ntpdの設定(CentOS5)

ntpdのコントロール

ntpdの動作チェック


SSHサーバーについて

sshdの設定(WBEL3,CentOS3)

sshdの設定(WBEL4,CentOS4)

sshdの設定(CentOS5)

sshdのコントロール

sshdの動作チェック

ポートフォワーディングの設定


DHCPサーバーについて

DHCPのインストールと設定

DHCPのコントロール

DHCPの動作チェック


sshdの構築に必要なファイル(CentOS5)

この コンテンツ に従って普通に CentOS5 インストール すると、 sshd とその設定に必要なファイル類は既に 構築中のLinuxサーバー にインストールされているはずです。

以下に、CentOS5にインストールされているsshdで、操作や設定が必要なファイルを示します。

それ以外の ディストリビューション をお使いの場合や、標準添付以外のパッケージをインストールした場合には、ファイル名やディレクトリの パス が以下とは異なる場合がありますので注意してください。

sshdの必要ファイル一覧
sshdの必要ファイル一覧

sshdの本体プログラムは"/usr/sbin/sshd"ですが、これを直接呼び出すことはまずありません。

実際にはこの"/usr/sbin/sshd"を用いて、起動や終了を容易にコントロールできるように記述された スクリプト である "/etc/rc.d/init.d/sshd" を用います。

また"/etc/rc.d/init.d/"の シンボリックリンク が"/etc/init.d/"になっていますので、スクリプトは "/etc/init.d/sshd" でも呼び出すことができます。

例えば、

"/etc/init.d/sshd start" →sshdの起動

"/etc/init.d/sshd stop" →sshdの停止

という使い方になります。

"/etc/rc.d/init.d/" には パス が通っていません パスが通っていないディレクトリにあるファイルの実行 から、パスを省略して実行することはできませんので注意してください。

sshdの設定ファイルは "/etc/ssh/sshd_config" です。

sshdはほとんどの動作についてこの"/etc/ssh/sshd_config"の内容を参照しますから、設定に関して書き換えが必要なファイルはこの"/etc/ssh/sshd_config"だけだと思ってよいでしょう。

"/etc/ssh/sshd_config" と同じディレクトリに、 "/etc/ssh/ssh_config" という微妙に名前の違うファイルがありますが、これは SSHクライアント 用の設定ファイルですので間違えないようにしてください。

ちなみに、 鍵交換による認証 を行う場合には一般に、接続に利用する ユーザーアカウント ホームディレクトリ 「鍵ファイル」 を作成することになります。

このページの先頭へ↑

"/etc/ssh/sshd_config"の編集(CentOS5)

"/etc/ssh/sshd_config" を編集するときは、 SSHクライアント からのリモート接続は避けます。

もし設定を間違えて SSH で接続できなくなってしまうと、結局実機を操作しなければならなくなりますから、ここは素直に 構築中のLinuxサーバー の実機に ログイン します 直接CentOS5にログインする

それから su コマンド ユーザーアカウント "root" に変更し、 cp コマンドでバックアップを作成した後、 nano エディタで "/etc/ssh/sshd_config" を開きます nanoエディタでファイルを開く

[tanaka@web1 ~]$ su -Enter
Password: "root"のパスワードを入力します。 Enter
[root@web1 ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orgEnter
[root@web1 ~]# nano /etc/ssh/sshd_configEnter


nanoで/etc/ssh/sshd_configを開く
nanoで"/etc/ssh/sshd_config"を開く

"/etc/ssh/sshd_config" は、 sshd が動作中でも自由に書き換えることができます。

ただし、 CentOS サーバー アプリケーション は通常、設定ファイルを保存しただけでは設定は反映されません。もちろんsshdもその例外ではありません。

サーバーアプリケーションの設定ファイルは、通常サーバーアプリケーションの起動時に参照されて読み込まれますから、設定ファイルの保存後にサーバーアプリケーションの再起動を行うか、設定ファイルの再読み込みのコマンドを実行しなければ、設定ファイルの修正は有効になりませんので注意してください。

sshdの再起動、設定ファイルの再読み込みについては、 sshdのコントロールについて で説明します。

このページの先頭へ↑

"/etc/ssh/sshd_config"について(CentOS5)

以下に編集前の"/etc/ssh/sshd_config"の内容を示します。

注釈の末尾にある()の値は、各キーワードの デフォルト の設定値です。

また、 灰色 で注釈を入れている設定値と、 赤色 で注釈を入れている範囲は、そのままでも特に支障はありませんし、深く理解する必要もありませんから、この コンテンツ では特に扱いません。ご了承ください。


#    $OpenBSD: sshd_config,v 1.73 2005/12/06 22:38:28 reyk Exp $

# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options change a

# default value.

#Port 22  1.利用するポート番号の指定(22)
#Protocol 2,1
Protocol 2  2.サポートするSSHのバージョンの指定(バージョン2)
#AddressFamily any
#ListenAddress 0.0.0.0   接続を許可するIPアドレス(すべて)
#ListenAddress ::   接続を許可するIPアドレス(すべて)

# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key   ホスト用鍵ファイルの指定(デフォルト値)
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key   ホスト用鍵ファイルの指定(デフォルト値)
#HostKey /etc/ssh/ssh_host_dsa_key   ホスト用鍵ファイルの指定(デフォルト値)

# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h   鍵ファイルの生成時間の指定(1時間)
#ServerKeyBits 768   サーバー用鍵ファイルのビット長(768ビット)

# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV   ログメッセージの分類の指定(AUTH)
#LogLevel INFO   ログメッセージの内容レベルの指定(INFO)

# Authentication:

#LoginGraceTime 2m   接続からログインまでの猶予時間(2分)
#PermitRootLogin yes  3."root"アカウントのログイン認証(許可)
#StrictModes yes   ユーザーパーミッションのチェック(有効)
#MaxAuthTries 6   ログインまでの最大許容試行回数(6回)

#RSAAuthentication yes   .RSA認証(許可)
#PubkeyAuthentication yes   公開鍵認証(許可)
#AuthorizedKeysFile   .ssh/authorized_keys   鍵ファイルの場所(デフォルト値)

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
 ※.このコンテンツではrhosts認証は扱いません
#RhostsRSAAuthentication no
# similar for protocol version 2
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no   パスワードなしでの認証(拒否)
PasswordAuthentication yes   パスワード認証(許可)

# Change to no to disable s/key passwords
 ※.このコンテンツではチャレンジレスポンス認証は扱いません
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no

# Kerberos options
 ※.このコンテンツではKerberos認証は扱いません
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

# GSSAPI options
 ※.このコンテンツではGSSAPI認証は扱いません
#GSSAPIAuthentication no
GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
GSSAPICleanupCredentials yes

# Set this to 'yes' to enable PAM authentication, account processing,
 ※.このコンテンツではPAM認証は扱いません
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication mechanism.
# Depending on your PAM configuration, this may bypass the setting of
# PasswordAuthentication, PermitEmptyPasswords, and
# "PermitRootLogin without-password". If you just want the PAM account and
# session checks to run without PAM authentication, then enable this but set
# ChallengeResponseAuthentication=no
#UsePAM no
UsePAM yes

# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL
#AllowTcpForwarding yes   TCP転送の許可(有効)
#GatewayPorts no   ポート中継の許可(無効)
#X11Forwarding no
X11Forwarding yes   X-Windowへのデータ転送(有効)
#X11DisplayOffset 10   X-Windowのディスプレイ番号オフセット値(+10)
#X11UseLocalhost yes   X-Windowをlocalhostでのみ使用許可(する)
#PrintMotd yes   対話ログイン時のメッセージ表示(有効)
#PrintLastLog yes   対話ログイン時の前回ログイン日時の表示(有効)
#TCPKeepAlive yes   接続状態の監視パケット送信(有効)
#UseLogin no   対話ログイン時の"login"コマンドの使用(無効)
#UsePrivilegeSeparation yes   起動プロセスをroot権限と分離する(有効)
#PermitUserEnvironment no   ユーザー環境変数の変更許可(拒否)
#Compression delayed   データ圧縮の許可(認証後に許可する)
#ClientAliveInterval 0   クライアント側の状態のチェック間隔(チェックしない)
#ClientAliveCountMax 3   クライアント側の状態チェック試行回数(3回)
#ShowPatchLevel no   OpenSSHのパッチ内容のクライアントへの通知(しない)
#UseDNS yes   クライアント側IPアドレスの逆引きチェック(する)
#PidFile /var/run/sshd.pid   プロセスIDファイル(PidFile)の指定(デフォルト値)
#MaxStartups 10   最大同時起動プロセス数(10)
#PermitTunnel no   トンネリング(VPN)の使用(しない)

# no default banner path
#Banner /some/path   警告メッセージのファイルの指定(なし)

# override default of no subsystems
 ※.このコンテンツではデータ転送サブシステムは扱いません
Subsystem    sftp  /usr/libexec/openssh/sftp-server

"#" で始まる行はコメント行として無視されますが、本当の意味でのコメント行はごく一部です("#"の後に一つスペースが入ってから記述されている行です。)

つまり"/etc/ssh/sshd_config"に記述されている大部分のコメント行は、

「設定値の記述の先頭に"#"を付けて無効化している。」

という形になっていますが、実はこれらの "#"で始まる設定はすべてデフォルトの設定値 です。

例えば、

#LoginGraceTime 2m
#PermitRootLogin yes
#StrictModes yes

という記述部分もすべてデフォルト値ですから、コメント記号をはずして、

LoginGraceTime 2m
PermitRootLogin yes
StrictModes yes

と書き換えても結果は変わりません。もちろん、設定そのものを削除しても同じです。

ただ、設定が最初から全く記述されていなかったり、あるいは、

LoginGraceTime 2m
PermitRootLogin yes
StrictModes yes

のような記述がなされていたとすると、 「何も設定を行わなかった場合の設定値」 、つまり本来のデフォルト値を知ることができなくなってしまいます。

こういう記述の仕方は サーバー アプリケーション の設定ファイルでは比較的珍しいほうです。わかり易いようで解りにくいようで...。

つまり、"/etc/ssh/sshd_config"は、 「何も設定を行わなかった場合の設定値」 が解らなくなってしまわないように、わざわざデフォルト値を"#"でコメントアウトした形で記述されているわけです。

従って、デフォルト値を変更して設定する場合には、上の記述にもあるように、例えば、

#SyslogFacility AUTH
SyslogFacility AUTHPRIV

あるいは、

#X11Forwarding no
X11Forwarding yes

のように"/etc/ssh/sshd_config"の作法に従って、 "#"+"デフォルトの値" は残したまま、変更後の設定値を下に記述するようにしましょう。

さて、これからこのファイルを編集していきますが、実は設定の変更が必要なのは、 1. 3. だけです。

実はあと一つだけ、デフォルト値の設定がないキーワードの追加を行いますが、それでも合わせて三つのキーワードしか扱いません。他はデフォルトのままでOKです。

これらのキーワードの変更は、 パスワード認証 での ログイン にあたって セキュリティ を確保するために必要なものですが、 鍵交換認証 でのログインの設定を行う場合にも必要となりますので、いずれ鍵交換認証の設定を行う場合でもきちんと設定しておきましょう。

このページの先頭へ↑

パスワード認証を用いる場合のsshdの設定(CentOS5)

sshd は"/etc/ssh/sshd_config"を修正しなくても、パスワード認証でのリモート接続は可能になっていますから、このパートでは

セキュリティ 上問題の起こりやすいパスワード認証でも、比較的安全にリモート接続を行うための設定。」

を行うことになります。

"Port"〜1.利用するポート番号の指定

行の先頭が "Port" というキーワードで始まる設定は、 sshd が通信を受け付ける ポート番号 の指定です。

デフォルト の"/etc/ssh/sshd_config"では、

#Port 22  1.利用するポート番号の指定(22)

となっています。デフォルトはもちろん、 SSH Well-Knownポート である 22 になっています。

常識的に考えればこの設定を変更する必要はなさそうに思えますが、実はセキュリティの面を考えると WAN 空間で ポート番号22を利用するのは望ましくありません

SSHや TELNET などの プロトコル は、一般的にリモート接続で サーバー機 をコントロールするのに使われます。

そしてその入り口ともいうべき 22 23 番というポート番号は、悪意を持って サーバー へ進入し、乗っ取りを企てているクラッカーにとっての進入経路でもあるわけです。

クラッカーは、 ポートスキャナー と呼ばれるプログラムを使い、 WAN 空間で公開運用されている ホスト を見つけると、まずはこういった 「ひょっとすると進入できるかもしれないポート番号」 が開放されているかどうかを調べます。

ログインに必要なパスワードは、サーバーの ドメイン名 FQDN から適当に推測したものが使われたり、例えば日本のドメイン名が使われているサーバーなら suzuki tanaka などの文字列にドメイン名や連続した数字が組み合わされたものが使われます。

そしてポートが開放されていることがわかったら、そのサーバーに対して、 "root" "admin" といった 「存在する可能性の極めて高い アカウント ログイン を試ます。

そして運よく(運悪く)パスワードが一致してしまえば、進入、乗っ取り、となってしまうわけです。

と、こういう説明をすると、

「そういうのは会社やなんかの大きなサーバーの世界の話で、自宅のちっちゃなサーバーなんか関係ないでしょ?。」

と思われるかもしれません。しかしそんなことはありません。

実はポートスキャナーの大半は自動探索プログラムで、攻撃対象にはサーバーの規模の大小は無関係といわれています。

実際にこの コンテンツ を運用しているサーバーも、自宅の片隅で細々と運用しているタイプですが、WAN側に 22 番ポートを開放していたサーバー構築直後は、毎日大量のポートスキャン攻撃をうけていました。

もちろん、きちんとしたパスワードを設定していれば実際に進入されることはありませんが、こういった攻撃をうけることで ルーター もsshdも余計な仕事をしなければならず、通信も無駄に使われてしまいますから本来のサービスに少なからず影響を及ぼすことになります。

という訳ですから設定のポイントは、

「攻撃を受けても大丈夫なシステムにする。」

だけではなく、

「できるだけ攻撃を受けないようなシステムにする。」

工夫を行うことにあるといえます。

では実際にはどうしたらポートスキャン攻撃を受けないようにできるのでしょうか。

幸いなことにポート番号は 0〜65535 まであり ポート番号の数について 、その大部分は未使用ですから比較的自由に使うことができます。

そこで例えば 56765 のような 「クラッカーにとって予想できないポート番号」 を利用してSSH接続を行うようにしたらどうでしょうか。

もし、リモート接続に用いられているポート番号が予め 22 23 のように決まっていないとすると、そのサーバーに進入するためには、ポートスキャナーはまず全てのポート番号について開放されているかどうかを調べなくてはなりません。

もしも一つのポート番号を調べるのに1秒必要だとすれば、すべてのポート番号を調べ終わるのに必要な時間は約18時間です。

そして次に、開放されているポート番号の中からリモート接続のためのプロトコルが使われているものを探し出して進入を試みる、というとても長い手順を踏むことになります。

もちろん、それで進入に成功すれば御の字ですが、もし成功できなければ「丸一日が徒労」に終わってしまうことになります。

クラッカーの大半は愉快犯ですから、特定のサーバーへの進入にこれだけの時間を割くことはしません。

クラッカーにとっては 22 23 などのポート番号を開放していないような、「リモート接続を利用していないかもしれない」あるいは「ポートスキャン対策をきちんと行っている可能性の高い」サーバーに手間隙かけて進入を試みたりはしません。

それよりも 22 23 などポートを平気で開放しているような「ガードが甘い可能性の高いサーバー」を数多く探し出して攻撃を仕掛けるほうが、はるかに進入できる確率が高いからです。

要するに、

「サーバーの入口で厳重な警備を行う。」

だけではなく、

「サーバーの入口がどこにあるのかわかならいようにする。」

という対策をとり、最初からクラッカーの攻撃対象にならないようにしてしまうわけです。

さて、具体的には、

1.sshdの"Port"の設定はデフォルトの22のまま変更せず、ルーターのポート番号変換機能 ルーターのポート番号変換機能について を使って、WAN空間からアクセスするときのポート番号だけ変更する。

2.sshdの"Port"の設定を変更し、ルーターのポート番号変換機能は使わずに、どこからでも同じポート番号で接続する。

の二種類の方法があります。

1. 場合は、"Port"キーワードの書き換えは不要ですが LAN 内の ホスト機 からSSH接続をする場合はポート番号 22 番で、WAN側からSSH接続を行う場合は別のポート番号でアクセスすることになりますのでやや面倒です。

ルーターのポート番号変換機能を使わず、LAN側からもWAN側からも同じポート番号で接続できるようにするには、 2. を選択することになります。この場合は"Port"キーワードの設定を次のように修正してください。

#Port 22
Port 56765

ルーターの種類によっては稀にポート番号変換機能がない場合や、設定可能であっても設定そのものが面倒なことがありますが、その場合は 2. の方法を用いることになります。

"Protocol"〜2.サポートするSSHのバージョンの指定

行の先頭が "Protocol" というキーワードで始まる設定は、利用を許可する SSH プロトコル のバージョンを決定します。

SSHには初期バージョンの"1"と、 セキュリティ を高めた"2"がありますが、SSHを利用する場合はSSH クライアント 側と使用するバージョンを一致させておく必要があります。

デフォルト の"/etc/ssh/sshd_config"では、

Protocol 2  2.サポートするSSHのバージョンの指定(バージョン2)

となっていますから、バージョン"2"のみで利用できることになります。

現行のSSHクライアントソフトは普通バージョン"2"をサポートしていますから、このままの設定でも特に問題はないでしょう。

ただし古いSSHクライアントの中にはバージョン"1"しか使えないものもありますから、こういう場合は

Protocol 1,2  2.サポートするSSHのバージョンの指定(バージョン1,2)

のように設定を行ってください。

"PermitRootLogin"〜3."root"アカウントのログイン認証

行の先頭が "PermitRootLogin" というキーワードで始まる設定は、 root アカウント からのアクセスに対しての sshd の処理を決定します。

デフォルト の"/etc/ssh/sshd_config"では、

#PermitRootLogin yes  2."root"アカウントのログイン認証(許可)

となっています。デフォルトは "yes" すなわち、 「rootによる ログイン を許可する」 になっています。

この"PermitRootLogin"では、例えば、

#PermitRootLogin yes
PermitRootLogin without-password

と設定すると、パスワード認証によるrootアカウントからのログインはできなくなりますが、鍵交換認証によるログインは許可されたままになります。

しかしながらこの コンテンツ では、どういう方法にしろrootアカウントでのSSHによるログインはお勧めしません。

それは、WAN空間からのSSHの利用に伴う セキュリティ 上の問題ではなく、 直接CentOS5にログイン危険性について の説明のような、 自分自身で操作するときの危険性 を回避するためです。

従ってここでは、rootアカウントによるログインを一切禁止するため、

#PermitRootLogin yes
PermitRootLogin no

という設定を行ってください。

もちろん、禁止されるのはSSHでのログインだけですから、ログイン後に su コマンド でアカウントをrootに変更することはできます。

"AllowUsers"〜指定したユーザーアカウントのみログインを許可

"AllowUsers" は、引数に記述された ユーザーアカウント にのみ ログイン 許可を与えるキーワードです。

デフォルト "/etc/ssh/sshd_config" にはこのキーワードの記述はありませんが、デフォルトの設定は 「すべてのユーザーアカウントにログインを許可する」 になっています。

もちろん、こういう設定はあまり好ましいものではありません。

メールサーバー FTPサーバー ファイルサーバー などの運用を始めると、知らず知らずのうちに 構築中のLinuxサーバー 内のユーザーアカウントは増えていきます。

もし sshd の設定"/etc/ssh/sshd_config"で、この"AllowUsers"の指定を行わない場合、これらの全てのユーザーアカウントに対してログイン許可を与えることになります。

UNIX OS の昔の運用形態である サーバー クライアント 方式をとらなくなった今では、ユーザーアカウントに対してリモートログインのサービスを与える必要はありません。

SSHによるリモートログインが必要なのは、現在ではサーバー管理者のみです。

"AllowUsers" の設定を追加すると、自動的にそのキーワードに記述されている以外の アカウント からのログインが禁止されます。

従ってここでは、"/etc/ssh/sshd_config"に以下の設定を追加して、ログインを行うべきユーザーアカウントを限定してしまいましょう。

AllowUsers tanaka

これで、 tanaka というユーザーアカウントのみにSSHによるログイン許可を与えられるようになります。もし、複数のユーザーアカウントに対してログイン許可を与えるときは、アカウント名をスペースで区切って次のように記述してください。

AllowUsers tanaka suzuki

これで、 tanaka 及び suzuki の二つのユーザーアカウントにログイン許可を与えられるようになります。

ただし、この"AllowUsers"キーワードでrootアカウントを記述しても、"PermitRootLogin no"の設定があればrootアカウントにはログイン許可は与えられませんので注意してください。

このページの先頭へ↑

"/etc/ssh/sshd_config"の例(CentOS5)

以上の内容で作成した "/etc/ssh/sshd_config" は、

sshd_conf5_sample01.txt
(ルーターのポート番号変換機能を使う場合)

または、

sshd_conf5_sample02.txt
(ルーターのポート番号変換機能を使わない場合)

をクリックすると表示できます。

これらの テキスト ファイルには余分な文字は入っていませんから、開いてコピー&ペーストで使用するか、 ダウンロード して使用してください。

もちろん、書き換えが必要な部分は適宜書き換えてください。

記述が終わったら "/etc/ssh/sshd_config" を保存し、nanoエディタを終了してください nanoエディタでファイルを開く

"/etc/ssh/sshd_config" の編集が終わったら、 sshd の起動または再起動を行って設定を有効化してください sshdのコントロールへ

このサイトは既に更新を終了していますが、今のところ店じまいの予定はありません。 リンクフリー ですので、趣味や勉強のためでしたら、引用、転用、コピー、朗読、その他OKです。このサイトへのリンクについては こちら をご覧ください。
Powered by Apache
”Linux”は、Linus Torvalds 氏の各国における登録商標です。”Red Hat”及びRed Hatのロゴおよび Red Hat をベースとしたすべての商標とロゴは、各国におけるRed Hat, Inc. 社の商標または登録商標です。その他のプログラム名、システム名、製品名などは各メーカー、ベンダの各国における登録商標又は商標です。
www.centos.org - The Community ENTerprise Operating System