IT pass HikiWiki - [Exp2024]最低限セキュリティ対策 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

[((<"2024 スケジュール表・各回資料(09/05)"|[Exp2024]スケジュール表・各回資料#09-2F05>))]


<目次>

{{toc_here}}

= 注意

このページの実習内容は, 自宅からのオンライン実習を想定しています.= ◎不要なサービスの停止

またネットワーク上の通信は「ポート」を通して行なわれます.
ポートは様々なネットワークサービスを提供するための窓口にあたり
, このページでは itpass サーバを ika と呼ぶことにします. つまり,
それぞれのネットワークサービスには固有のポート番号が割り付けられています.


  itpass サーバUNIX(Linux) の場合, ポートを監視し,
ネットワーク上にサービスを提供するプログラムを「デーモン」と呼びます.
ポートは
== ika == itpass.scitec.kobe-u.ac.jpTCP/IP における TCP 層で規定されるものですが,
デーモンは UNIX(Linux) 上のある特定の役割を持ったプログラムの名称です.


です. ("==" UNIX(Linux) 「同じ」の意味で書いています.)サーバとして様々なネットワークサービスを行なえるようになっています (例えばメール配送を行なう smtpd, Web を公開するための httpd, 遠隔ログインを可能にするための sshd 等).
セキュリティを高めるためには, 必要なネットワークサービス以外行なわないようにするのが良いでしょう.


必要のないネットワークサービスを提供しないようにするには, そのネットワークサービスを提供するデーモンを停止する, またはポートをふさぐことが必要となります.

= 遠隔ログインでの X の利用== ポート/デーモンの状況を調べる

ここでは現在稼働しているデーモンを調べるには,
システムで動いているプロセスの中から
, 遠隔ログインにおいて「X を飛ばす デーモンプロセスを探します
(ウィンドウを飛ばす)」方法について実習します. デーモンプロセス名は一般に最後に d が付くものが多いです).
ps コマンドを使うことでプロセスを一覧できます.


Linux では, 他の OS と同様に独自にウィンドウを開くアプリケーションがたくさん使われています (今となっては当たり前すぎるかもしれませんが).
しかし, ここまでに行ってきた遠隔ログインの実習では, 遠隔地の計算機でコマンドを実行したり, 遠隔地の計算機とファイルのやり取りをしましたが, 遠隔地の計算機で新しくウィンドウを開くようなアプリケーションを実行してはいません.
  $ ps aux        

Unix/Linux では X Window System あるいは X と呼ばれるウィンドウシステムを採用しまた, その機能を用いてウィンドウを描画してアプリケーションが動作しています.
ssh でログインした遠隔地にある計算機で新たにウィンドウを開くアプリケーションが実行されると
現在のネットワーク状況を確認し, X によるウィンドウの情報が ssh の通信を通して伝達され, 手元の計算機上に遠隔地のアプリケーションが生成するウィンドウが開かれることになります (補足 2 参照).
パケットを待機しているポートを探すには
netstat コマンドを使用すると良いでしょう.


なお, このとき遠隔地から新たにウィンドウを開いてアプリケーションを実行する (ウィンドウを飛ばして実行する) ことを「X を飛ばす」と表現することがあります (以下そのように略記します).$ netstat -an

コマンドがインストールされていないとのメッセージが出た場合は,

== ssh を用いたリモートログインで X を飛ばす$ sudo apt install net-tools

X を飛ばすためにはでインストールを行ってから, ssh のリモートログインにおいて -X オプションを付ける必要があります再度実行してください.
つまり,


tcp/udp 通信において, 状態が $ ssh -X -l [リモートホストのユーザ名] [サーバ名LISTEN になっているポートが外部に対して
開いているポートになります.
予期しないポートが
or IP アドレス]LISTEN 状態になっていたら,
そのポートを監視しているプロセスを止めましょう.


もしくは== inetd 経由で呼び出されるデーモンの設定

デーモンは担当のポートを常時監視し,
要求が来たときにサービスを提供するプログラムを起動します.
しかし多くのデーモンが常に存在していると
それだけメモリ等の計算機リソースを消費します.
そこで計算機リソースの節約のためにポート監視専用のデーモン
$ ssh -X [サーバ名 or IP アドレス] -l [リモートホストのユーザ名] inetd を用意し,
基本的なネットワークサービス(ftp, telnet 等)は
inetd から呼び出される仕組みになっています.


inetd から呼び出されるサービスは
/etc/inetd.conf や
もしくは/etc/services に記述されており,
不必要な個所をコメントアウトすることでサービスの提供を止めることが可能です.
/etc/inetd.conf でコメントアウトしたサービス (デーモン)
は inetd から呼び出されなくなります.
また, /etc/services でコメントアウトしたポートはふさがり,
(デーモンが起動していても) 外部/内部からの要求を受け入れなくなります.


$ ssh -X [リモートホストのユーザ名]@[サーバ名 or IP アドレス]inetd 経由で呼び出されるデーモンの設定については, ここでは行いませんが参考までに((<"こちらのページ"|URL:/~itpass/exp/fy2024/240905/practice_linuxConfig/>))の「不要なネットワークサービスを止める」を見ておいて下さい.

です.:実習その3 情報実験機の現在の状況を確認して下さい. 設定自体は, 既に前回の実習において行なっているはずです.

X を飛ばすためには, ssh == 不要なソフトウェア(デーモン)通信経路に X の情報を通さなければなりません. その指定のためのオプションが -X です. アンインストール

inetd から呼び出されるプログラム以外は,をそれぞれ独自の設定によってアク
セス制限を行ないます.  不要なソフトウェア(デーモン)はアンインストールし
ておくのが最も安全でしょう.


では実際に試してみましょう.#((*この節の作業は実際には行わないこと!*))

:実習その#Debian の場合,
#例えば
1: ika でportmap というソフトウェアをアンインストールする際は,
#先ず
xeyes portmap 実行する.

自宅から
提供する ssh に -X オプションを付けて ika にログインしてくださいDebian パッケージを検索します.
(MobaXTerm を用いているならば#
#
-X オプションを付ける必要はなく, いつものようにログインしてください.)

  [ユーザ名]@ika-itpass:~$

ここで X を用いたアプリケーション (新しいウィンドウを開くアプリケーション) を実行してみましょう.
$ dpkg -S portmap
そのようなアプリケーションのうちで入門時によく使われる定番に# xeyes があります. xeyes はウィンドウ上にカーソルがある方向を示してくれるアプリケーションですportmap: /etc/init.d/portmap      <-- コロンの左がパッケージ名.
下のように実行してみましょう.

  [ユーザ
#                                        コロンの右がパッケージの提供する
#                                        ファイル
]@ika-itpass:~$ xeyes &

自分の PC に「目玉」が表示されましたか?

表示されれば成功です#
#検索に引っかかったパッケージをアンインストールします
.
(ところで#
#
"&" はどういう意味だったでしょうね? 忘れてしまったならば調べてみましょう.)

もし「目玉」が表示されずにエラーが表示されるならば
$ dpkg -r portmap                 <-- 設定ファイルは残したまま, X を飛ばす設定ができていないことになります. remove
ssh に -X オプションを付けましたか?


:実習その 2: 情報実験機で xeyes を実行する.

自宅から ssh に -X オプションを付けて ika にログインしてください.
#         もしくは
(MobaXTerm を用いているならば# -X オプションを付ける必要はなく, いつものようにログインしてください.)

  [ユーザ名]@ika-itpass:~$

ここからさらに ssh に -X オプションを付けて情報実験機にログインしてみましょう.
$ dpkg --purge portmap            <-- パッケージが提供する
その上で, 情報実験機で xeyes を実行してみましょう.

  [ユーザ名]@johoXX-itpass:~$ xeyes &

自分の PC に「目玉」が表示されましたか?

もし表示されれば, 文字情報だけでなく X (ウィンドウ) の情報が, まずは情報実験機から itpass サーバに ssh を通して伝達され, そこからさらに ssh を通して自宅の PC に無事に伝達されたわけです.


:実習その 3: -X オプションの効果を確かめる.

自宅から ssh に -X オプションを付けて ika にログインしてください.
#                                        全てのファイルを削除
(MobaXTerm を用いているならば -X オプションを付ける必要はなく, いつものようにログインしてください.)

  [ユーザ名]@ika-itpass:~$

それから ssh に -X オプションを((*付けずに*))情報実験機にログインしてみましょう.
#
その上で, 情報実験機で xeyes を実行してみましょう.

  [ユーザ名]@johoXX-itpass:~$ xeyes &

自分の PC に「目玉」が表示されましたか?

ここでは「目玉」は表示されないはずです.
#
どのようなエラーメッセージが表示されましたか?== 主要なネットワークデーモン/ネットワークサービス一覧(参考)

X を飛ばす設定 (ssh に -X オプションを付ける) を忘れることは良くやってしまうミスです.
ここで表示されるエラーメッセージを是非頭の片隅に置いておきましょう.
ポート番号とサービス名の対応は, /etc/services で見ることができます.

  $ less /etc/services        

:実習その 4: gnuplot でグラフを描く主なポートとサービスは以下の通りです.

((<惑星学実験実習の基礎II|URL:https://itpass.scitec.kobe-u.ac.jp/hiki/hiki.cgi?惑星学実験実習の基礎II>)) では  # RT
  ポート番号
, gnuplot サービス名, 解説
#           9,     discard, 過去の遺物
#          13,     daytime, 過去の遺物
          21,         ftp, ftp サーバ. これはパスワードが平文(暗号化されない)ので非常に危険. ssh
使ってグラフを描く方法を学びました使うならば ftp は不要です(scp を使う). もしくは OTP(使い捨てパスワード)を導入すべき.
          22,         ssh, ssh 接続を受けつけるサーバ.
          23,      telnet, telnet 接続を受け付けるサーバ. これはパスワードが平文(暗号化されない)ので非常に危険. ssh を使うならば telnet は不要. もしくは OTP(使い捨てパスワード)を導入すべき.
          25,        smtp, メール配信(転送)を行なう. メールを送信するだけならば smtp ポートを開く必要はない
.
ここでは, ssh で情報実験機にログインし#          37,        time, 過去の遺物
          53,      domain, ホスト名を返す(いわゆる
gnuplot を使ってグラフを描いてみましょうDNS サーバ).
          70,      gopher, 旧式の文献検索サーバ.
          79,      finger, ホストにログインしているユーザの情報を返す.ネットワーク攻撃を行う指針となるので絶対にこのサービスを提供してはいけない. 試しに "$ finger @(ホスト名)" もしくは "$ finger (ユーザ名)@(ホスト名)" してみよ.
          80,        http, www サーバ.
#          98,   linuxconf, ネットワーク経由でシステムを設定するためのサーバ. GUIベースや Web ベースの設定インターフェースを提供する.
         110,       pop-3, メール受信サービス. パスワードを要求するがそのパスワードは平文のままなので危険.
         111,      sunrpc, UNIX のポート間通信メカニズム
         113,        auth, 接続相手の情報を得るために使われるサーバ(ident). anonymous ftp 等で用いられる.
         119,        nntp, NetNews の相互配送につかわれるサーバ.
         123,         ntp, コンピュータの内部時計をネットワークを介して正しく調整するのに用いられる.
         139, netbios-ssn, samba(window と UNIX でのファイル共有)に使われる.
         143,        imap, メールサーバからクライアントにメールを渡すために用いられる. これはパスワードを暗号化する.
#         512,        exec, 過去の遺物
#         513,       login, 過去の遺物
#         514,       shell, 過去の遺物
         515,     printer, 印刷サーバ(lpr)
#         613,        cups, 印刷サーバ(cups)
        1178,     skkserv, 漢字変換プログラム skk の辞書サーバ
        2401,  cvspserver, cvs サーバ
. cvs のリポジトリを公開する場合に使用する.
#        5680,       canna, 漢字変換プログラム canna のサーバ
        6000,         X11, X サーバ
       22273,        wnn6, 漢字変換プログラム wnn サーバ


gnuplot はインストールされていないと思いますので, まずはインストールしなければなりません.
下のようにしてインストールしましょう.
= △アクセス制限(フィルタリング)

  $ sudo apt install gnuplotセキュリティ対策として,
アクセスできるホストを制限してみましょう.  
ここでは設定が比較的簡単な tcp_wrapper を用いてアクセス制限を行ないます.


インストール出来たら, 例えば「gnuplot 練習問題」から自分の好きなデータを選んでグラフを描いてみましょうtcp_wrapper は inetd 経由で呼び出されるサービスについて
アクセス制限を行なうためのプログラムです
.
上で実習したことを使えば, 自分の例えば PC でそのグラフを見ることができるはずです. /etc/inetd.conf に

gnuplot の使い方は, ((<<こちら>|URL:https://itpass.scitec.kobe-u.ac.jp/hiki/hiki.cgi?惑星学実験実習の基礎II>)) を見て思い出しましょう.  skkserv  stream  tcp  nowait  nobody  /usr/sbin/tcpd  /usr/sbin/dbskkd-cdb

と記述されている時に
inetd が skk サービスを呼び出す場合は,


= 補足  (1) skk サービス要求があると, inetd は 1tcpd を起動する.
  (2) tcpd は接続要求元が接続許可されているか判断する.
  (3) 許可されているならば, /usr/sbin/dbskkd-cdb を起動する
  (4) dbskkd-cdb が接続要求元に対して skk サービスを提供する


本実習では, Windows PC を用いている人は MobaXTerm を用いて ika へログインすることを推奨していますという手続きを踏んでいます.
そして, 上では, ssh のログインでは -X オプションを付ける必要があると書いている一方で, MobaXTerm でのログインでは特別な指定は必要ないと書いています. この時に「tcpd を起動」し「接続の許可・不許可を判断する」プログラムが
これは, MobaXTerm が ssh ログインの際に標準的に内部で -X オプション (に相当するもの) を使用しているためです. tcp_wrapper です.

= 補足 2== △tcp_wrapper の設定

ここまでの説明では, ssh にtcp_wrapper によるアクセス制限は -X を付けることで/etc/hosts.allow もしくは X を飛ばすことができると説明してきました. /etc/hosts.deny
しかし, X を飛ばす仕組みのすべてを説明してはいませんによって設定します. どちらも書き方は以下の通りです.

Unix/Linux で採用している  デーモン名: アクセスを許可(もしくは禁止する)ホスト名(もしくは X Window System はサーバ・クライアント方式で動作しています. 「X サーバ」はディスプレイ・スピーカー・キーボード・マウスといった当該計算機の入出力を統括するソフトウェアです. これらの入出力機器を利用する個々のアプリケーションを, X サーバに対して依頼を出すものという意味で「X クライアント」と言います. 個々のアプリケーション, すなわち, X クライアントは X サーバに対してウィンドウをこれこれの位置にこれこれの大きさで表示しろだのキーボードからの入力を受け付けろだのの依頼を出すわけです. X サーバと X クライアントとのこういった様々な情報のやり取りを記すための手順を X プロトコルと言います. X Window System の特徴は, 手元の計算機内のみならず遠隔計算機との間でも区別なく情報のやりとりを行えるように X プロトコルを設計した, すなわち, ネットワーク透過な設計を実現した点にあります. IP アドレス).

遠隔計算機上のアプリケーションが手元計算機のディスプレイにウィンドウを表示する場合には以下の三つの要素で構成されることになります.
* 遠隔計算機でアプリケーション
例えば, すなわち, X クライアントが動作する.
* 手元計算機でディスプレイを制御統括する X サーバが動作する.
* 手元計算機のサーバと遠隔計算機のクライアントとの間で X の通信が行われる.
遠隔計算機としての情報実験機や ika では, X クライアント (アプリケーション
/etc/hosts.allow(許可する内容を記述) が動作します.
ssh の -X オプションは, 手元計算機と遠隔計算機との ssh による安全な接続を介して, サーバとクライアントの間の X の通信を確立します. ssh は, X クライアントに対して, X サーバが動作する機材のIPアドレスやディスプレイ情報などを自動的に送ってくれます.  
しかし, X を飛ばすためにはもう一つの要素, 自分の PC 上で X サーバが動作していることが必要です.
において,

macOS はそのベースが  # vi /etc/hosts.allow
  ALL: 127.0.0.1               <- [localhost からは全てのアクセスを許可]
  sshd: 10.35.19.x           <- [10.35.19.x からの
Unix に類する OS のため, X サーバがそもそも動作しています.
したがって, macOS から
ssh に -X オプションを付けて情報実験機や ika にログインする場合には, 上の三つの要素が揃っています. 接続を許可]

一方, Windows はつぎに Unix とは独自に作られた OS であり, それ自体では X サーバが動作していません (Windows は X プロトコルを解釈できません).
MobaXTerm は X サーバに相当する機能をあわせ持っていて, 遠隔計算機上のクライアントからの X サーバへの依頼を Windows が解釈できる依頼に翻訳してくれるため, それを用いることで上の三つの要素を揃えることができ, X を飛ばすことができるのです.
/etc/hosts.deny(許可しない内容記述) において

Windows 用のアプリケーションには, MobaXTerm 以外にも ssh で X の通信を伝達できるものがあります. 例えば ((<TeraTerm|URL:https://ttssh2.osdn.jp/>)) や ((<Putty|URL:https://www.putty.org/>)) というアプリケーションは, 設定によって ssh を通した X の通信が可能です.
しかし, TeraTerm や Putty は, それ自身が X サーバの機能を持つわけではないため, それだけでは X を飛ばすための三つの要素を揃えることができません.
三つの要素を揃えるためには, Windows 上で X サーバの機能を実現する別のアプリケーションが必要です.
  # vi /etc/hosts.deny
  ALL: ALL                     <- [全てアクセスを禁止]


X サーバの機能を果たす Windows 用のアプリケーションもいくつか作られています. ((<Xming|URL:http://www.straightrunning.com/XmingNotes/>)) はその一つです.
したがって, Xming を使いつつ, X の通信を伝達できる設定で TeraTerm や Putty を使えば三つの要素を揃えることができて X を飛ばすことができます.
と設定することで,

(TeraTerm + Xming や  * localhost からは全てアクセス許可
  * 10.35.19.x からの
Putty + Xming より MobaXTerm 一つのみで済む方が簡単なので, 本実習では MobaXTerm の利用を推奨しています.)sshd へのアクセスは許可
  * それ以外のアクセスは全て拒否


となります.
hosts.allow と hosts.deny で重複する内容がある場合は, hosts.allow が優先されます.
また, hosts.allow と hosts.deny の両方に記述がないホストは, 接続が許可されます.


#= 補足:実習その4 同じ班の情報実験機からの 3
#
#上で, X Window System がサーバ・クライアント方式で動作していることを書きました.
#例えば, 手元の PC (Windows でも macOS でも) から ika に
ssh でログインして, ika で xeyes を実行することを考えましょう.
#このとき, 手元の PC と ika のどちらがサーバでどちらがクライアントでしょうか?
#
#多くの人は, xeyes が動作する ika がサーバで, その動作の結果である「目玉」が表示される手元の PC がクライアントと考えるでしょう.
#多くのサーバ・クライアント方式の考え方ではその通りで, サービスを提供する側 (上の場合は xeyes が動作している計算機) をサーバ, サービスを提供されている側 (上の場合は「目玉」が表示されている計算機) をクライアントと呼びます.
#
#しかし, X Window System の設計では逆です.
#上の例では, 手元の PC がサーバで, ika がクライアントとなります.
#これは, 手元の PC で X が動作しており, ika は X のアプリケーションを提供しているからです.
#
#詳しくは, 例えば((<<ここ>|URL:http://www.astec-x.com/FAQ/aboutx.html>))を参照すると良いかもしれません
でのアクセスを制限してみて下さい.

実習その4 では, 以下の手順で実習を行ないます.

= 補足 3(1) ssh で同じ班の情報実験機からログインを試みてもらう. 成功したらログアウトしてもらう.
(2) いま使っている情報実験機において, sshd に対してアクセス制限を設定する.
(3) 同じ班の情報実験機からのログインが禁止されていることを確認する


上の説明では((*実習その4 が終了した後, 手元の PC から情報実験機や ika に遠隔ログインする状況を想定しています.
つまり, X Window System
sshd サーバとクライアントが別の計算機にある状況です. アクセス制限を解除しておいて下さい.*))

しかし, 仕組みとしては, このサーバとクライアントは別の計算機にある必要は無く, 同じ計算機上にある場合でも全く同様に「通信」して機能しています.
#実際, 一つの計算機の中でも X のサーバとクライアントは別のアプリケーション (プロセス) として起動していて, 一つの計算機の中でサーバとクライアントが通信することでウィンドウが動作しています.

もちろん, この時にはサーバとクライアントの間の通信は ssh を通す必要はありませんので, その分だけ動作が少し「簡単」かもしれませんね.== △さらに進んだ情報: xinetd, iptables(Linux), ipfw(FreeBSD)

ここでは inetd 経由で呼び出されるデーモンについてのアクセス制限を行ないました.
ですが, inetd を介さないデーモンについては,
各々のデーモン毎にアクセス制限を行う必要があり,
tcp_wrapper によるアクセス制限を行なう事ができません.
inetd から呼びだされないデーモンについても
tcp_wrapper によるアクセス制限を行ないたい場合には,
inetd の発展版である xinetd を用います.
#xinetd については ((<http://www.xinetd.org/|URL:http://www.xinetd.org/>)) を参照して下さい.
## ページが閉鎖されてしまったようなのでコメントアウト
#((<"xinetd FAQ の日本語訳"|URL:http://www.yamdas.org/column/technique/xinetd_faqj.html>)) も参考になるでしょう.
((<"xinetd FAQ の日本語訳"|URL:http://www.yamdas.org/column/technique/xinetd_faqj.html>)) などを参考にしてください.


また, inetd や xinetd といったプログラムレベルでのアクセス制限ではなく,
カーネルレベルでアクセス制限を行なう(パケットをフィルタリングする)仕組みとして,
Linux では iptables, FreeBSD では ipfw などがあります.
iptables や ipfw は大変高機能ですが, ここでは詳しくは触れません.
詳細については
((<"netfilter/iptables project homepage"|URL:http://www.netfilter.org/>))
等を参照して下さい.



[((<"2024 スケジュール表・各回資料(09/05)"|[Exp2024]スケジュール表・各回資料#09-2F05>))]