このエントリーをはてなブックマークに追加
スポンサーリンク

telnet/sshの設定

telnetの設定

telnetとは
telnetとは、sshと同じようにコマンドラインでサーバーを遠隔操作するためのサーバーソフトと、それを操作するためのアプリ、そして、 そのパケットのやりとりの手順を定めたプロトコルの事をいいます。 それぞれ、telnetサーバー、ターミナルソフト(telnet端末)、telnetプロトコルといいいます。

telnetはsshと比べて以下の長所、短所があります
長所 パスワードを間違えると数秒間ペナルティーがある。
WinSCPで覗かれにくい。
デフォルトでルートアカウントのログインが禁止されている。
短所 パスワードが平文で流れる。
telnetはパスワードが平文で流れるため、セキュリティーを重視するサイトでは開放しない場合が多いです。つまり、途中経路に悪意を持った人(悪のプロバイダー?)がいた場合、ルーターのログを見るとパスワードが丸見えになってしまうためです。顧客によっては、telnetポート(23番)をファイアウォールで完全に封鎖するように要求される場合もあります。

そのかわり、パスワードを間違えた場合の数秒のペナルティーは大きなメリットで、sshで英単語総当りでパスワードを入れた場合でも大して時間はかかりませんが、同じことをtelnetでやろうとするとペナルティーの分、相当の時間がかかってしまいます。

なので、大抵のアタッカーはsshポートが開いてない場合、総当りでのアタックはしてこない事が多いです。

インストール
RedHat9やCentOS4.xではdisc3に入ってます。disc3をマウントしておき、

rpm -ivh telnet-server-0.17-31.EL4.3.rpm
としてインストールします。

ただし、インストール時に「レガシーなネットワークサーバ」のところでF2を押して詳細を表示させ、(*)telnet-serverにチェックを入れれば自動的にインストールされます。telnetサーバーを使う事が多い方はインストール時に指定しておくと、あとあとdisc3だけマウントしなくて済むので作業が楽になります。

デフォルトでは、disableになっているので、起動するようにします。

vi /etc/xinet.d/telnet
# default: on
# description: The telnet server serves telnet sessions; it uses \
#       unencrypted username/password pairs for authentication.
service telnet
{
        flags           = REUSE
        socket_type     = stream        
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
        disable         = no
}
disable=yesになっているのをnoに書き換えます。ただし、chkconfig telnet on でも同じ効果が得られます。

その後、xinetdをリスタートします。
/etc/rc.d/init.d/xinetd restart

telnetではルートでのログインは禁止されているので、適当なログインアカウント(自分の名前のローマ字表記とか)を作っておきます。

ファイアウォールの設定
telnetは23番ポートを使うので、tcpの23番ポートをACCEPTにします。ただし、allに対してACCEPTにすると、いくら数秒のペナルティーがあるとはいえ、世界中からやられたらパスワード総当り方式でそのうちパスワードが破られてしまうので、遠隔でログインする場所からのみ許可にしておきます。

Tcp-Wrapperの設定
23番ポートを完全に塞ぐのではなく、いったんソケットの接続を受付て、アクセス元によって通す/通さないを判別する方法があります。これはTcp-Wrapperです。

IPTABLESを使うと、ポートを封鎖した途端にアクセス不能になりますが、Tcp-Wrapperはログイン時のみのチェックであるため、あるポートを操作する、またはあるURLを叩く、などなどのサーバー管理者のみぞ知る操作を行う事で、一時的に任意のIPからアクセス可にでき、一度ログインしたらログアウトするまでは締め出されないという抜け道を作る事ができます。勤務時間外にもノートPCを持ち歩いているサーバー管理者にこの手は重宝します。

/etc/hosts.allow
in.telnetd : (許可するIPアドレス/ネットマスク) : allow

/etc/hosts.deny
all : all : deny

Tcp-Wrapperではポート番号ではなくサーバー名で許可を設定するので、
FTPのような任意のポートを使う場合に設定がやりやすくなります。

IPTABLESと両方で塞いでおくとさらにセキュリティーは向上します。

telnetでIDとパスワードを入れてから、プロンプトが表示されるまでが遅い場合
原因は大きくわけて3つ(※他のケースもあるかも?)です。

@ネームサーバーがない

接続元のホスト名をログに記録するためにtelnetサーバーは接続元の逆引きを試みます。そのため、逆引きするためのネームサーバーがないと逆引きをタイムアウトするまで試みるため、かなり待たされます。

A接続元が逆引きされてない

接続元のIPが逆引きされてない場合、「ない」という情報を得るまで時間がかかる場合があります。ローカルネット内で接続する場合、接続元を/etc/hostsに登録しておくか、ローカル用のDNSがあると良いです。

Bホスト名が.comドメインで、サブドメインがない

原因は不明ですが、ホスト名がなんとかかんとか.comで、サブドメインなしの場合、ログインしてからプロンプトが表示されるまで5秒ほどペナルティー(?)が与えられます。この場合、ホスト名にサブドメインをつけてあげればペナルティーがなくなります。

例)
hostname www.○○○○.com

どうしてもサブドメインをつけられない時は、接続元のIPとホスト名を/etc/hostsに登録してあげればペナルティーはなくなります。また、手持ちの.jpドメインのサブドメインを与えてホスト名として設定するという手もあります。

SSHの設定

xinetd経由で起動させる
RedHat9やCentOSではデフォルトではスタンドアロン起動になっていますが、 sshdには負荷を与えるとルート権限が乗っ取られてしまう不具合がたびたび報告されているため、念のためxinetd経由で起動するように変更します。

・起動時にsshdを起動しないようにする
/etc/rc.d/init.d/sshd stop
chkconfig sshd off

sshdではなくxinetdから呼ばれるようにする
vi /etc/xinetd.d/ssh
# default: on
# description: The ssh server serves ssh sessions; it uses \
#       unencrypted username/password pairs for authentication.
service ssh
{
        disable = no
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/sshd
        server_args     = -i
        log_on_failure  += USERID
}
2ちゃんねるに「なぜxinetdを経由させるとルート権限が乗っ取られなくなるのか」とか書いてありましたが、 完全に乗っ取られなくなるわけじゃありません。 sshdを常駐させない分だけルート権限が乗っ取られる可能性が下がるだけです。 sshd以外の脆弱性にはひっかかる場合があります。たとえば、もしxinetdに脆弱性があれば、そのせいでかえってルート権限が乗っ取られるかもしれません。 それと、このサイトに関する質問を他方に投げるのはやめてください。
ルートログイン禁止
パスワード総当りでアタックを試みる場合、IDとパスワードの組み合わせが当たらないとログインができません。しかし、rootの場合はIDがrootに固定されているので、パスワードだけaaaaaaからzzzzzzまで総当りでログインを試みればアクセスできてしまう事があります。そのため、アタックを試みる側はIDをrootにてログインを試みてきます。sshがtelnetよりもアタックされやすい原因はここにあります。

そこでルートログインを禁止に設定します。

vi /etc/ssh/sshd_config
PermitRootLogin no
その後、xinetdをリスタートします。
/etc/rc.d/init.d/xinetd restart

どうしてもルートで許可したい場合は、IPTABLESやTcp-WrapperでsshでアクセスできるIPを制限します。

例)Tcp-Wrapperを使う場合
/etc/hosts.allow
sshd : (許可するIPアドレス/ネットマスク) : allow
/etc/hosts.deny
all : all : deny
スポンサーリンク