Chapter 18. Securing Samba

Andrew Tridgell

Samba Team

John H. Terpstra

Samba Team

May 26, 2003

Table of Contents

序論
機能と利便性
保護対応と問題に関する技術的な議論
ホストベースの保護の使用
ユーザーベースの保護
インタフェース保護の使用
ファイアウォールの使用
IPC$ 共有ベースの拒否の使用
NTLMv2のセキュリティ
Sambaのアップグレード
よくあるエラー
smbclientはローカルホストで動くが、ネットワークは死んでいる
なぜユーザーが他のユーザーのホームディレクトリをアクセスできるのか?

序論

この章に含まれる情報は、一般的にすべての導入したSambaに対して適用できる。セキュリティは IT界において、すべての人の関心事である。驚くべき数のSambaサーバーが直接インターネットに 接続するマシン環境上にあり、そのため、ファイアウォールの内側でプライベートネットワーク 上にあるサーバーよりもよりセキュリティ的に危険な状態にある。極端にサーバーセキュリティを重視 する場合、セキュアなネットワーク中に配置されるサーバーはもちろん、頑丈なファイアウォールを、 ネットワーク管理者の一部が要求することになる。この章では、どのように必要とされる障壁 (バリア)を作るかと言うことと、脅威に対する防御を理解する管理者(所属は 問わない)を手助けする情報を提供する。

新しい実習生が、ボイラー室のチーフエンジニアの所に、任務のために出勤してきた。彼曰く、 ただいま出勤しました。ボイラーを見せていただければ作業を開始します。 エンジニア曰く、そのボイラーに腰掛けているぞ!

セキュリティに関する関心はこのようなものである。その大部分が本当にどのくらい明白かを 評価するため、この問題に対して多少知っておく必要がある。挑戦の大部分は、熟練者が持つ 秘技を解き明かすかもしれない知識の最初のかけらを探り出すことである。

機能と利便性

サイトを少なくとも適度に安全にするために守るべき、セキュリティ原則の3つのレベルがある。 それらは外側に対するファイアウォール、Sambaが動いているホストサーバーの設定とSambaそれ 自身である。

Sambaは、ネットワークセキュリティに対する最も柔軟なアプローチを認めている。可能な限り、 Sambaは、Microsoft Windowsのファイルとプリント操作に対して許可される、よりセキュアな、 最も最新のプロトコルを実装している。

Sambaはローカルネットワーク外から来る接続からセキュアに出来る。これは ホストベースの保護を、tcpwrappersとして知られている、 技術の実装を使うことか、インタフェースベースの除外を使うことで行え、 その結果、smbdは許可された特定のインタフェースのみにバインドする。また、たとえば [IPC$]自動共有上のような、共有またはリソースベースの除外を 設定することも可能である。[IPC$]共有は、TCP/IPコネクションを 確立するのと同様、ブラウジング目的に使われる。

Sambaをセキュアに出来る他の方法は、共有それ自身に、アクセスコントロールリスト(ACL)中に アクセス制御エントリ(ACE)を設定することである。これは ファイル、ディレクトリと共有のアクセス制御 に説明がある。

保護対応と問題に関する技術的な議論

既知のセキュリティ上の弱点と侵害技術に対して保護するために、せいぜいドアを閉めることで 十分であることが、セキュリティの鍵となる難問である。これらの少ない処置を行ったので、 Sambaサーバーが入り込めない要塞になると仮定してはいけない。これまでの情報システムの歴史を 見れば、誰かが他の脆弱性を見つけ出すのは時間の問題である。

ホストベースの保護の使用

数多くのインストール済みSambaにおいて、最も大きな脅威は、隣接したネットワークの 外部から来る。既定値で、Sambaは任意のホストからの接続を受け、それはすなわち、 もしも、インターネットに直接接続されているホスト上でセキュアでないバージョンの Sambaを動かしていた場合、特に脆弱になるということである。

この場合の最も簡単な修正の1つは、hosts allowhosts denyをSambaのsmb.conf設定ファイル中で、 特定の範囲のホストから飲みサーバーにアクセスを許可するように使うことである。 設定例は以下の通り:

hosts allow = 127.0.0.1 192.168.2.0/24 192.168.3.0/24
hosts deny = 0.0.0.0/0

上記はSMB接続を、localhost(自分自身)と2つのプライベート ネットワークである192.168.2 と 192.168.3. からのみ許可する。その他の接続要求は クライアントから最初のパケットが来たらすぐに拒否される。拒否は、 呼び出された名前ではリッスンしていないというエラーとして マークされる。

ユーザーベースの保護

もしも、サーバーへのアクセスを有効なユーザーのみに制限したいならば、以下の方法を 使うことが出来る。smb.conf中の[global]セクションに 以下を記述する:

valid users = @smbusers, jacko

これは、ユーザーjackoかシステムグループsmbusers のメンバーのみに、すべてのサーバーアクセスを制限する。

インタフェース保護の使用

既定値では、Sambaはシステム上にある任意のネットワークインタフェースからの 接続を受け付ける。これは、もしもISDNかPPPでインターネットに接続している 場合、Sambaはそれらからの接続を受け付けるということである。これはおそらく 希望していることではないだろう。

この動作は、以下のようなオプションで変更できる:

interfaces = eth* lo
bind interfaces only = yes

これは、たとえばeth0eth1のような ethで始まる名前のインタフェースと、lo という名前のループバックインタフェースからの接続のみを受け付ける事を指示する。 必要とする名前はどのOSを使っているかに依存する。上記ではLinux上での共通的な イーサネットアダプターの名前を使っている。

もしも、上記を使い、誰かがppp0という名前のPPPインタフェース 上でホストに対してSMB接続を行おうとした時には、TCPの接続が拒否されたという応答が 帰る。この場合、OSが、任意のSambaプロセスに対して、そのインタフェースからの接続を 渡さないと通知するため、Sambaは全く動作しない。しかし、接続拒否という応答は、 クラッカーに対して、そのIPアドレスが有効なサービスを提供しているという確認をさせて しまうということにもなる。

もっと良い対応は、接続を全く無視することである(たとえばppp0から)。接続を拒否する ことと比較して接続を無視する試みの利点は、脆弱性攻撃かサービス不能(DoS)攻撃時に 後で使うための有効なIPアドレスを見つけるためが唯一の意図の探索を失敗させることで ある。潜在的な悪意がある行動を取り扱うこの方法は、適切なファイアウォール機構 を使うことが必要である。

ファイアウォールの使用

多くの人が、使用しているネットワーク外に公開したくないサービスへのアクセスを拒否 するためにファイアウォールを使っている。これはよいアイデアではあるが、上記の と関連して使用することを勧める。そうすると、何らかの理由でファイアウォールが 無効になったとしても保護が出来る。

もしもファイアウォールを設定するとき、どのTCPとUDPポートを許可し、ブロック るかを知っておく必要がある。Sambaは以下のポートを使う:

Port 135/TCP - used by smbd
Port 137/UDP - used by nmbd
Port 138/UDP - used by nmbd
Port 139/TCP - used by smbd
Port 445/TCP - used by smbd

最後のものは、多くの古いファイアウォールの設定がそれを知らないかもしれない という理由で重要である。このポートは最近付け加えられた。

ファイアウォールを設定するとき、ハイオーダポート(1024-65535)は外向きの接続に 使われ、そのため、ファイアウォールを通るようにする必要がある。確立した接続を 除いて、ハイオーダポート上の入力パケットをブロックすることは賢明である。

IPC$ 共有ベースの拒否の使用

もしも、上記の方法が適していないのであれば、最近セキュリティホールで使われた IPC$共有に拒否の設定をすることが出来る。これは、潜在的に信頼できないホスト からのIPC$へのアクセスを拒否する間、他の共有へのアクセスを提供する。

これを行うには以下のようにする:

[IPC$]
hosts allow = 192.168.115.0/24 127.0.0.1
hosts deny = 0.0.0.0/0

これは、2つの指定されたネットワークアドレス(ローカルホストと 192.168.115の サブネット)以外のどこからもIPC$共有への接続を許可しないようにSambaに指示する。 IPC$共有のみが常時匿名でアクセスできる共有であるという理由で、これは、 そのホストで有効なユーザー名/パスワードを知らない攻撃者に対してあるレベルの 保護を提供する。

もしもこの方法を使うのであれば、クライアントがIPC$共有にアクセスした時に、 `access denied'となる。それらクライアントは共有をブラウズ 出来ず、その他のリソースの一部にもアクセスできないだろう。この方法は、ここで説明 してきた方法のどれかが、何らかの理由で使えない場合を除いて推奨しない。

NTLMv2のセキュリティ

NTLMv2認証を設定するためには、以下のレジストリキーは知っておく価値がある:

		[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]
		"lmcompatibilitylevel"=dword:00000003
		

0x00000003という値はNTLMv2レスポンスのみを送ることを意味する。クライアントは NTLMv2認証を使う。もしもサーバーがサポートしているなら、NTLMv2セッション セキュリティを使うこと。ドメインコントローラーはLM、NTLMとNTLMv2認証を受け取る。

		[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0]
		"NtlmMinClientSec"=dword:00080000
		

0x00080000という値はNTLMv2セッションセキュリティのみを許可することを意味する。 もしも、NtlmMinClientSecかNtlmMinServerSecが0x00080000に設定されるならば、 もしもNTLMv2セッションセキュリティがネゴシエートされたときに接続は失敗する。

Sambaのアップグレード

アップデートと重要な通知があるかどうかを、 https://www.samba.org/ で定期的に確認してほしい。時折セキュリティリリースが作成され、セキュリティ上の脆弱性が 発見されたときには直ちにSambaをアップグレードすることを強く推奨する。また、OS固有の アップグレードはOSベンダーに確認すること。

よくあるエラー

もしも、SambaおよびSambaが動作するホストの設定が、誰もが期待するように直感的であれば、 この章は不必要である。セキュリティの問題は、問題の複雑性の理由からではなく、 セキュリティ問題の要求と判明することを投稿するほとんどの管理者が、全くSambaの問題で あると確信しているという理由で、サポート担当の人にとってしばしばやっかいである。

smbclientはローカルホストで動くが、ネットワークは死んでいる

これはよくある問題である。Linuxベンダーは既定値のファイアウォールをインストールする 傾向がある。既定値のファイアウォールの状態ではループバックアダプター (IPアドレスが 127.0.0.1)のみの通信が、ファイアウォール経由で許可される。

解決方法は、ファイアウォールを取り除く(停止する)か、SMBネットワークトラフィックが 通過できるようにファイアウォールスクリプトを修正することである。 ファイアウォールの使用の節を参照のこと。

なぜユーザーが他のユーザーのホームディレクトリをアクセスできるのか?

一度有効なパスワードが供給されると、他のユーザーのホームディレクトリへ個別のユーザーが マッピングすることを阻止できない。ユーザーが自分自身のホームディレクトリのみを マッピング出来るように、Sambaを設定する方法を見つけられない。

ユーザーxyzzyは自分自身のホームディレクトリをマップ出来る。一度マップすると、ユーザー xyzzyは他の誰のホームディレクトリでもマップ出来る。

これはセキュリティの欠陥ではない。これはデザインによるものである。Sambaは、 定義された共有に許されるように、ファイルシステム上のそのような表示のみを 認める事を除いて、UNIXマシンにログオンしていた時と正確に同じような、 UNIX ファイルシステムへのアクセスをユーザーに認める。

もしも、使用しているUNIXのホームディレクトリが設定されていてあるユーザーが、 他のユーザーのディスク中に、何の問題もなくcdでき、 lsを実行出来るならば、UNIXのセキュリティの解は、 ユーザーのホームディレクトリ上のファイルのパーミッションを変更して、 そのために、 cdlsは拒否される。

Samba は、UNIX管理者が定めるセキュリティポリシを勝手に解釈(second guess) しないように、非常に気を使っており、UNIX管理者が、ポリシーやパーミッションを 意図通りに(desire)設定していると確信している。

Sambaは要求した動作を許可する。[homes]共有定義中に only user = %Sオプションを単におくこと。 Samba allows the behavior you require. Simply put the only user = %S option in the [homes] share definition.

only userパラメーターは users = listパラメーターと一緒に動作するので、 要求する動作を得るためには以下の行を追加する:

users = %S

これは下記を追加するのと同じである。

valid users = %S

[homes]共有の定義のためには、smb.conf マニュアルページでの推奨のようにする。