多くの場所で、Telnet によるシステムへの接続を中止し、代わりに SSH を使用することが義務付けられています。その理由は、セキュリティの強化です。Telnet を使用してログインする場合、パスワードやその他のデータはすべて平文で送信されます。 ネットワークアナライザを持っている人なら誰でも、送信された内容を読み取ることができます。一方、SSHはすべてのデータを暗号化するため、読み取ることができません。TelnetとSSHのデーモンは、ユーザー体験において互換性があると考えられがちですが、これは誤りです。
まず、SSHやTelnetのクライアントにはさまざまな種類があります。これらはユーザーインターフェースが異なり、使用するターミナルタイプも異なる場合があります。同じターミナルタイプを使用している場合でも、クライアントはターミナルをエミュレートしているものであり、そのエミュレーションは完全ではないため、動作が異なることがあります。 しかし、クライアントソフトウェアの違いを差し引いたとしても、Telnetデーモン(telnetdまたはtelnet_msd)に接続したセッションと、SSHデーモンに接続したセッションの間には、微妙なものからそれほど微妙ではないものまで、いくつかの違いが存在します。また、いくつかのバグも存在しますが、これについては後述します。 なお、ここではOpenVOSリリース2.1.0k用のInternet Security Pack (ISP)に含まれるSSHデーモンを使用しています。これは本稿執筆時点で入手可能な最新バージョンです。
ユーザー名:
ログインする前から、TelnetとSSHではユーザー名の扱いに違いがあります。Telnetデーモンでは、ユーザー名のユニークなバリエーションであればどれでもログインが可能で、大文字と小文字も区別されません。 ユーザー名「Noah_Davids」の場合、Telnet を使用すれば Noah_D、noah_d、NoAh_D、NoAh_DaViDs のいずれでもログインできますが、SSH で機能するのは「Noah_Davids」のみです。私のエイリアス「nd」も同様です。Telnet では nd、ND、nD のいずれも使用できますが、SSH では nd のみが機能します。
グループ名:
Telnet接続時に表示されるログインプロンプトでは、 グループ名
telnet 164.152.77.217 接続を試みています... 164.152.77.217 に接続しました。 エスケープ文字は '^]' です。 OpenVOS リリース 17.1.0ax、モジュール %phx_vos#m17 ログインしてください 15:24:14 login nd.SysAdmin パスワード? [ここにパスワードを入力] Noah_Davids.SysAdmin %phx_vos#m17 に 12-12-12 15:24:55 mst にログインしました。 |
| 図1 – グループ名を使用したTelnetログイン |
しかし、SSHプロトコルではユーザー名のみが許可されています。グループ名を含めると、それがユーザー名の一部として扱われ、ログインに失敗してしまいます。
>system>openssl>bin>ssh [email protected] nd.システム管理者@164.152.77.217 のパスワード: [ここにパスワードを入力] アクセスが拒否されました。もう一度お試しください。 [email protected] のパスワード: |
| 図2 – グループ名を使用したSSHログイン |
ログイン後は、サブログインを使用して所属グループを変更できます(ただし、現在の制限については、以下の「ssl-403」のセクションを参照してください)。
パスワードの違い:
Telnet接続とSSH接続におけるパスワード処理の最大の違いは、SSHでは認証にパスワードが不要であるという点です。公開鍵と秘密鍵のペアを設定すれば、パスワード入力の手順をすべて省略できます。その設定方法については、「Stratus STCP SSHで公開鍵認証を使用するように設定する」をご覧ください。
パスワードを使用している場合、いくつかの違いに注意する必要があります。まず、パスワードの有効期限の扱いが異なります。Telnetでは、パスワードの有効期限が近づくとログインプロンプトで警告が表示され、パスワードを変更できるようになっています。
telnet 164.152.77.217
接続中...
164.152.77.217 に接続しました。
エスケープ文字は '^]' です。
OpenVOS リリース 17.1.0ax、モジュール %phx_vos#m17
ログインしてください 14:04:40
login nd
パスワード? [現在のパスワードを入力]
パスワードの有効期限はあと5日です。
新しいパスワード(最初の入力)?
|
| 図3 – Telnet接続のパスワード有効期限切れに関する警告/プロンプト |
SSHは警告を表示しますが、設定を変更するオプションはありません。パスワードを無効にするには `change_password` コマンドを使用する必要があります。これにより、次回のログイン時にパスワードの変更が強制されます。
ssh [email protected] [email protected] のパスワード: [現在のパスワードを入力] パスワードの有効期限はあと5日です。 Noah_Davids.CAC が %phx_vos#m17 に 2013年1月9日 13:06:35 (MDT) にログインしました。 ようこそ。 準備完了 13:06:35 パスワード変更 パスワードの有効期限が切れています。次回のログイン時に変更する必要があります。 準備完了 13:06:49 |
| 図4 – SSH接続のパスワード有効期限切れに関する警告 および change_password コマンド |
パスワードの有効期限が切れるか(または `change_password` コマンドでパスワードを無効にした場合)、パスワードの変更を求められます。Telnet とは異なり、これは任意ではなく、この時点で必ずパスワードを変更する必要があります。パスワードを変更すると自動的にログアウトされるため、再度ログインする必要があります。
ssh [email protected] [email protected] のパスワード: 警告: パスワードの有効期限が切れています。 今すぐパスワードを変更し、再度ログインしてください! 現在のパスワードは? [現在のパスワードを入力] 新しいパスワード(1回目)? [新しいパスワードを入力] 新しいパスワード(2回目)? [新しいパスワードを入力] 164.152.77.217 への接続が切断されました。 |
| 図5 – SSH接続中のパスワード変更 |
もう一つの違いは、SSH接続ではチャレンジ・レスポンス方式のパスワードがサポートされていないのに対し、Telnet接続ではサポートされているという点です。
サブシステム:
Telnetでモジュールに初めて接続する際、loginコマンドを使用すると、 サブシステム
OpenVOS リリース 17.1.0ax、モジュール %phx_vos#m17
ログインしてください 11:23:40
login -form -usage
--------------------------------- ログイン -------------------------------
ユーザー名:
-特権: 登録済みとして
-パスワード:
-パスワード変更: いいえ
-優先度:
-ホームディレクトリ:
-モジュール:
-サブシステム:
|
| 図6 – Telnet接続では、サブシステム名を指定できます |
SSHプロトコルには、サブシステム名を指定する仕組みはありません。登録データベースのエントリで must_use_subsystem フラグが設定されている場合、登録エントリで最初に指定されたサブシステムが自動的に使用されます。このビットが設定されていない場合は、サブシステムは使用されません。 (ISP 2.1.0j 以前のリリースでは、`must_use_subsystem` ビットが設定されていなくても、最初のサブシステムが使用されていたことに注意してください。)実際にログインする前に利用可能な `login` コマンドの引数には、サブシステムを指定する方法が含まれていますが(図 6 を参照)、ログイン後はそのオプションは利用できなくなります(図 7 を参照)。
ログイン -フォーム -使用方法 --------------------------------- ログイン ------------------------------- グループ名: CAC -特権: はい -優先度: -パスワード: -モジュール: |
| 図7 – sub-login コマンドライン引数 |
ログイン後にサブシステムにアクセスする唯一の方法は、そのシステムにTelnetで再接続し、再度ログインすることです。
telnet 127.0.0.1 接続中... 127.0.0.1 に接続しました。 エスケープ文字は '^]' です。 OpenVOS Release 17.1.0ax, Module %phx_vos#m17 ログインしてください 11:37:34 login nd -subsystem test_ss パスワード? Noah_Davids.CAC が %phx_vos#m17 に 12-12-13 11:37:49 mst にログインしました。 これはテストサブシステムです。 準備完了 11:37:49 |
| 図8 – ループバックアドレスにTelnet接続し、再度ログインしてサブシステムにアクセスする |
アクセス制御:
Telnet および SSH 接続はいずれも TCP Wrappers をサポートしており、IP アドレスに基づいてアクセスを制限することができます。ただし、Telnet デーモンでは、デフォルトでは TCP Wrappers が有効になっていないため、-tcpwrapper_check 制御引数を使用して明示的に有効にする必要があります。一方、SSH デーモンでは、TCP Wrappers はデフォルトで有効になっており、無効にする方法はありません。 TCP Wrappersのhosts.allow設定ファイルですべてのSSH接続を許可することで、事実上これを無効にすることができます。
telnetd -form -usage
------------------------------- telnetd ------------------------------
-service_file: >system>stcp>telnetservice
-tcpwrapper_check: no
-numeric: yes
|
| 図9 – telnetd デーモンでの TCP Wrappers の有効化 |
telnet_msd -form -usage
------------------------------ telnet_msd ----------------------------
-network_port: 24
-max_sessions: 28
-error_severity: 2
-separate_log: yes
-log_dir: >system>stcp>logs
-vterm_starname: telnet*
-vterm_login: yes
-vterm_slave_id:
-extension: 133
-force_edit: yes
-EC_decimal_value: 8
-EL_decimal_value: 21
-tcpwrapper_check: no
-numeric: no
|
| 図10 – telnet_msd デーモンでの TCP Wrappers の有効化 |
sshd デーモンは、sshd_config ファイル内のオプションもサポートしており、SSH 経由でのアクセスを許可するユーザーやグループ(AllowUsers および AllowGroups ディレクティブ)、あるいは拒否するユーザーやグループ(DenyUsers および DenyGroups ディレクティブ)を指定することができます。これらのディレクティブでは、ユーザー名、送信元ドメイン、またはその組み合わせを指定できます。 たとえば、corp.stratus.com からの noah_davids へのアクセスを許可し、az.stratus.com からのアクセスを拒否することが可能です。
許可するユーザー: *@*.stratus.com 拒否するユーザー: *@*az.stratus.com |
| 図11 – sshd_config における AllowUsers および DenyUsers ディレクティブの例 |
>system>openssl>bin>ssh [email protected] [email protected] のパスワード: アクセスが拒否されました。もう一度お試しください。 [email protected] のパスワード: |
| 図12 – DenyUsers ディレクティブにより、phxtest-m15.az.stratus.com からのログインが拒否されました |
コマンド環境:
Telnetでログインすると、標準のVOSコマンド環境が表示されます。SSHでは、管理者が標準のコマンド環境かbashシェル環境のいずれかを指定できます。これはポート番号に基づいて行われます。
d sshservices %phx_vos#m17_mas>opt>openssl>etc>sshservices 12-12-13 12:31:31 mst ssh "window_term" "" "login" 1 1 s$pt_log.m16 ssh2200 "window_term" "-shell" "bash" 1 1 s$pt_log.m16 |
| 図13 – sshservicesファイル。ポート22は標準のVOSコマンドライン( ) ポート2200はbashシェルです |
>system>openssl>bin>ssh [email protected] -p 2200 [email protected] のパスワード: ようこそ。 sh-2.05$ |
| 図14 – ポート2200を使用したSSH接続とbashシェルの取得 |
環境変数:
デフォルトでは、Telnet接続では6つの環境変数のみが設定されますが、SSH接続では12個が設定されます
env HOME=/SysAdmin/Noah_Davids LOGNAME=root PATH=.:/system/command_library:/system/applications_library:/system/maint_library +y:/system/nio/command_library:/system/tools_library:/opt/apache/bin:/opt/libxml +2/bin:/opt/php/bin:/opt/openssl/bin:/opt/mysql/bin:/system/stcp/command_library\ +:/system.17.1/gnu_library/bin VOS_INCLUDE_PATH=.:/opt/apache/include:/opt/openssl/include:/opt/mysql/include/m +ysql:/system/stcp/include_library/compat:/system/include_library VOS_OBJECT_PATH=.:/opt/apache/lib:/opt/openssl/lib:/opt/mysql/lib/mysql:/system/ +stcp/object_library/complib:/system/posix_object_library/pthread:/system/posix_ +object_library:/system/c_object_library:/system/object_library TERM=vt100 |
| 図15 – Telnet接続で設定された環境変数 |
env HOME=/SysAdmin/Noah_Davids PATH=.:/system/command_library:/system/applications_library:/system/maint_library +y:/system/nio/command_library:/system/tools_library:/opt/apache/bin:/opt/libxml +2/bin:/opt/php/bin:/opt/openssl/bin:/opt/mysql/bin:/system/stcp/command_library\ +:/system.17.1/gnu_library/bin VOS_INCLUDE_PATH=.:/opt/apache/include:/opt/openssl/include:/opt/mysql/include/m +ysql:/system/stcp/include_library/compat:/system/include_library VOS_OBJECT_PATH=.:/opt/apache/lib:/opt/openssl/lib:/opt/mysql/lib/mysql:/system/ +stcp/object_library/complib:/system/posix_object_library/pthread:/system/posix_ +object_library:/system/c_object_library:/system/object_library\ TERM=vt100\ TZ=mst+07:00:00\ USER=Noah_Davids\ LOGNAME=Noah_Davids\ MAIL=/var/spool/mail/Noah_Davids\ SHELL=/bin/sh SSH_CONNECTION=164.152.77.34 49573 164.152.77.217 22 SSH_TTY=#s$pt_log.m16_3 |
| 図16 – SSH接続で設定される環境変数 |
デバイスの種類:
最後に、これは厳密にはTelnetとSSHの違いではなく、telnetdおよびsshdデーモンとtelnet_msdデーモンの違いです。telnetdとsshdはどちらもwindow_termデバイスを使用しますが、telnet_msdはvtermデバイスを使用します。 vtermデバイスとwindow_termデバイスは、コマンドラインでのファンクションキー(CANCELなど)の処理方法や、生の画面出力の扱い方にいくつかの違いがあります。 独自のフォームを作成し、新しい s$control OP_CODE を使用するように更新されていない一部のアプリケーションは、window_term デバイスを使用すると、それらのフォームを正しく表示できません。これらのアプリケーションに対処する次善の策は、SSH トンネルを使用してシステムに接続し、そのトンネルを telnet_msd デーモンに接続するように設定することです。もちろん、アプリケーションを新しい OP_CODE を使用するように更新することが、最善の対処法です。
TelnetとSSHに固有の上記の違いに加え、今後のリリースで修正される予定のバグがいくつかあります。
ssl-403 利用可能なグループ:
Telnetで接続する場合、登録エントリで指定されたすべてのグループがサブログインで利用可能ですが、sshの場合は最初の5つのグループのみ利用可能です。
私がCAC、SysAdmin、Group_3、Group_4、Group_5、Group_6の各グループに登録されていることを踏まえると、Telnet接続からこれらのグループのいずれかを使用してサブログインを行うことができます
telnet 164.152.77.217 接続中... 164.152.77.217 に接続しました。 エスケープ文字は '^]' です。 OpenVOS Release 17.1.0ax, Module %phx_vos#m17 ログインしてください 15:38:02 login nd パスワード? [現在のパスワードを入力] Noah_Davids.CAC が %phx_vos#m17 に 12-12-12 15:38:08 mst にログインしました。 login Group_5 Noah_Davids.Group_5 が %phx_vos#m17 に 12-12-12 15:39:39 mst にログインしました。 準備完了 15:39:39 ログアウト ログイン Group_6 Noah_Davids.Group_6 が %phx_vos#m17 に 2012年12月12日 15:40:13 (MST) にログインしました。 準備完了 15:40:13 |
| 図17 – Telnet接続によるサブログイン |
しかし、sshでGroup_6を使用しようとすると、エラーが発生します。
>system>openssl>bin>ssh [email protected] [email protected] のパスワード: Noah_Davids.CAC が %phx_vos#m17 に 12-12-12 15:41:02 mst にログインしました。 準備完了 15:41:02 ログイン Group_5 Noah_Davids.Group_5 が %phx_vos#m17 に 2012年12月12日 15:41:24 (MST) にログインしました。 準備完了 15:41:24 ログアウト ログイン Group_6 ログイン: 引数の形式が不正です。group_name として Group_6 は許可されていません。 準備完了 15:41:59 |
| 図18 – SSH接続によるサブログイン |
ssl-418 – sub_process_level:
Telnet経由のログインのsub_processレベルは0ですが、SSH経由のログインのsub_processレベルは3です。
telnet 164.152.77.217
接続中...
164.152.77.217 に接続しました。
エスケープ文字は '^]' です。
OpenVOS リリース 17.1.0ax、モジュール %phx_vos#m17
ログインしてください 14:15:34
login nd
パスワード? [現在のパスワードを入力]
Noah_Davids.CAC が %phx_vos#m17 に 12-12-13 14:15:39 mst にログインしました。
ready 14:15:39
display_line (process_info sub_process_level)
0
準備完了 14:15:49
|
| 図19 – Telnet接続におけるサブプロセスレベルの設定 |
>system>openssl>bin>ssh [email protected] [email protected] のパスワード: [現在のパスワードを入力] Noah_Davids.CAC が %phx_vos#m17 に 2013年12月12日 14:12:23 (MST) にログインしました。 準備完了 14:12:23 display_line (process_info sub_process_level) 3 準備完了 14:12:37 |
| 図20 – SSH接続におけるサブプロセスレベルの設定 |
2013年1月14日更新: これはバグではなく、仕様であることが判明しました。sshdプロセスは、listeningプロセスを開始するためにstart_processが実行された際に1回、sshdが接続を受け入れた際に2回、そしてユーザーログインプロセスが作成された際に3回、それぞれフォークされます。一方、Telnetはユーザープロセスを開始するために異なるメカニズムを使用しており、フォークされたプロセスは生成されません。
タイムゾーンに関する問題:
最後に、夏時間と標準時間の切り替え、あるいはより一般的にはタイムゾーンの変更に関連して、いくつかの問題が発生していたことをお伝えしておきます。SSH経由でログインしたセッションでは、新しいデフォルト設定が反映されませんでした。これらの問題はすべて、今回の最新リリース(2.1.0k)で修正されているはずです。
