Hosts.allow - Linux命令 - Unix命令

名稱

hosts_access - 主機訪問控製文件的格式

描述

本手冊頁描述基於客戶端(主機名/地址,用戶名)和服務器(進程名稱,主機名/地址)模式的簡單訪問控制語言。 最後給出了例子。 我們鼓勵急躁的讀者跳到EXAMPLES部分以獲得快速介紹 。訪問控制語言的擴展版本在hosts_options (5)文檔中進行了描述。 在程序構建時通過使用-DPROCESS_OPTIONS構建擴展。

在以下文本中, 守護進程網絡守護進程的進程名稱, client是請求服務的主機的名稱和/或地址。 網絡守護進程進程名稱在inetd配置文件中指定。

訪問控製文件

門禁軟件查閱兩個文件 。 搜索停止在第一場比賽。

當(守護進程,客戶端)對匹配/etc/hosts.allow文件中的條目時,訪問將被授予。

否則,當(守護進程,客戶端)對匹配/etc/hosts.deny文件中的條目時,訪問將被拒絕。

否則,訪問將被授予。

一個不存在的訪問控製文件被視為一個空文件。 因此,訪問控制可以通過不提供訪問控製文件來關閉。

訪問控制規則

每個訪問控製文件由零或多行文本組成。 這些行按照外觀順序進行處理。 當找到匹配項時搜索結束。

當換行符前面加上反斜杠字符時,會忽略換行符。 這使您可以分解長行,以便更容易編輯。

以'#'開頭的空白行或行將被忽略。 這允許您插入註釋和空白,以便表格更易於閱讀。

所有其他行應滿足以下格式,[]之間的內容可選:

daemon_list:client_list [:shell_command]

daemon_list是一個或多個守護進程名稱(argv [0]值)或通配符(見下文)的列表。

client_list是一個或多個主機名,主機地址,模式或通配符(見下文)的列表,它們將與客戶端主機名或地址相匹配。

daemon @ hostuser @ host的複雜形式分別在服務器端點模式和客戶端用戶名查找部分進行說明。

列表元素應該用空格和/或逗號分隔。

除NIS(YP)網絡組查找外,所有訪問控制檢查都不區分大小寫。

格局

訪問控制語言實現以下模式:

以'。'開頭的字符串 字符。 如果其名稱的最後一個組件與指定的模式匹配,則會匹配主機名。 例如,`.tue.nl'模式匹配主機名'wzv.win.tue.nl'。

以'。'結尾的字符串 字符。 如果主機地址的第一個數字字段與給定字符串匹配,則該主機地址相匹 例如,模式'131.155'。 與埃因霍溫大學網絡(131.155.xx)上的每個主機(幾乎)的地址相匹配。

以“@”字符開頭的字符串被視為NIS(以前稱為YP)網絡組名稱。 如果主機名是指定網絡組的主機成員,則會匹配主機名。 守護程序進程名稱或客戶端用戶名稱不支持網絡組匹配。

形式'nnnn / mmmm'的表達式被解釋為'net / mask'對。 如果“net”等於地址和“掩碼”的按位“與”,則IPv4主機地址匹配。 例如,網絡/屏蔽模式`131.155.72.0/255.255.254.0'匹配`131.155.72.0'至`131.155.73.255'範圍內的每個地址。

形式'[n:n:n:n:n:n:n:n] / m'的表達式被解釋為一個'[net] / prefixlen'對。 如果`net'的prefixlen'位等於地址的'prefixlen'位,則IPv6主機地址匹配。 例如,[net] / prefixlen模式`[3ffe:505:2:1 ::] / 64'與範圍'3ffe:505:2:1 ::'到'3ffe:505:2: 1:FFFF:FFFF:FFFF:FFFF'。

以'/'開始的字符串被視為文件名 。 如果主機名或地址與指定文件中列出的任何主機名或地址模式匹配,則該主機名或地址相匹配。 文件格式為零行或多行,零個或多個主機名或地址模式由空格分隔。 文件名稱模式可用於任何可以使用主機名或地址模式的地方。

通配符`*'和`?' 可用於匹配主機名或IP地址 。 這種匹配方法不能與'net / mask'匹配,以'。'開頭的主機名匹配。 或以`。'結尾的IP地址匹配。

通配符

訪問控制語言支持顯式通配符:

所有

通用通配符始終匹配。

本地

匹配名稱不包含點字符的任何主機。

未知

匹配名稱未知的任何用戶,並匹配名稱地址未知的任何主機。 應謹慎使用此模式:由於臨時名稱服務器問題,主機名可能不可用。 當軟件找不到它正在與之通話的網絡類型時,網絡地址將不可用。

匹配名稱已知的任何用戶,並匹配其名稱地址已知的任何主機。 應謹慎使用此模式:由於臨時名稱服務器問題,主機名可能不可用。 當軟件找不到它正在與之通話的網絡類型時,網絡地址將不可用。

PARANOID

匹配名稱與其地址不匹配的任何主機。 當tcpd使用-DPARANOID(默認模式)構建時,即使在查看訪問控製表之前,它也會丟棄來自這些客戶端的請求。 如果您希望更多地控制此類請求,請在沒有-DPARANOID的情況下構建。

運算符

預期使用的形式是:`list_1 EXCEPT list_2'; 此構造匹配與list_1匹配的所有內容,除非它與list_2匹配。 EXCEPT運算符可以在daemon_lists和client_lists中使用。 EXCEPT運算符可以嵌套:如果控制語言允許使用括號,`a EXCEPT b EXCEPT c'將解析為`(a EXCEPT(b EXCEPT c))'。

外殼命令

如果第一個匹配的訪問控制規則包含shell命令,那麼該命令將受到%替換(請參閱下一節)。 結果由/ bin / sh子進程執行,標準輸入,輸出和連接到/ dev / null的錯誤。 如果您不想等待完成,請在命令末尾指定一個“&”。

Shell命令不應該依賴inetd的PATH設置。 相反,它們應該使用絕對路徑名,或者它們應該以明確的PATH = whatever語句開始。

hosts_options (5)文檔描述了以不同且不兼容的方式使用shell命令字段的替代語言。

%擴展

以下擴展在shell命令中可用:

%a(%A)

客戶端(服務器) 主機地址。

%C

客戶端信息:用戶@主機,用戶@地址,主機名或地址,具體取決於可用的信息量。

%d

守護進程名稱(argv [0]值)。

%h(%H)

客戶端(服務器)主機名或地址(如果主機名不可用)。

%n(%N)

客戶端(服務器)主機名(或“未知”或“偏執”)。

%p

守護進程ID。

%S

服務器信息:守護進程@主機,守護進程@地址或只是一個守護進程名稱,具體取決於可用的信息量。

%u

客戶端用戶名(或“未知”)。

%%

擴展為一個`%'字符。

可能會混淆外殼的%擴展中的字符被替換為下劃線。

服務器端點模式

為了通過它們連接的網絡地址來區分客戶端,請使用以下格式的模式:

process_name @ host_pattern:client_list ...

當機器具有不同的互聯網地址和不同的互聯網主機名時,可以使用這些模式。 服務提供商可以使用此工具提供FTP,GOPHER或WWW檔案,其中包含可能屬於不同組織的互聯網名稱。 請參閱hosts_options (5)文檔中的`twist'選項。 某些系統(Solaris,FreeBSD)可以在一個物理接口上擁有多個互聯網地址; 與其他系統一樣,您可能不得不求助於SLIP或PPP偽接口,這些接口位於專用網絡地址空間中。

host_pattern遵循與client_list上下文中的主機名和地址相同的語法規則。 通常,服務器端點信息僅適用於面向連接的服務。

客戶用戶名查找

當客戶端主機支持RFC 931協議或其後代之一(TAP,IDENT,RFC 1413)時,包裝程序可以檢索有關連接所有者的附加信息。 客戶端用戶名信息(如果可用)與客戶端主機名一起記錄,並可用於匹配以下模式:

daemon_list:... user_pattern @ host_pattern ...

守護程序包裝可以在編譯時進行配置,以執行規則驅動的用戶名查找(默認)或總是詢問客戶端主機。 在規則驅動的用戶名查找的情況下,只有當daemon_listhost_pattern匹配時,上述規則才會導致用戶名查找。

用戶模式與守護進程模式具有相同的語法,因此應用相同的通配符(不支持網絡組成員資格)。 不過,用戶名查找不應該被忽略。

客戶端用戶名信息在最需要時不能被信任,即客戶端系統已被入侵。 通常,ALL和(UN)KNOWN是唯一有意義的用戶名模式。

用戶名查找只能在基於TCP的服務中使用,並且只能在客戶端主機運行適當的守護程序時才能使用; 在所有其他情況下,結果是“未知的”。

當用戶名查找被防火牆阻止時,一個眾所周知的UNIX內核錯誤可能會導致服務丟失。 包裝器的README文件描述了一個程序來確定你的內核是否有這個錯誤。

用戶名查找可能會導致非UNIX用戶明顯延遲。 用戶名查詢的默認超時時間為10秒:太短而無法應對慢速網絡,但時間長到足以激怒PC用戶。

選擇性的用戶名查找可以緩解最後一個問題。 例如,像這樣的規則:


daemon_list:@pcnetgroup ALL @ ALL

會匹配pc網絡組的成員,而不進行用戶名查找,但會執行與所有其他系統的用戶名查找。

檢測地址欺騙攻擊

許多TCP / IP實現的序列號生成器中的缺陷允許入侵者輕鬆地模擬可信主機並通過例如遠程外殼服務來入侵。 IDENT(RFC931等)服務可用於檢測此類和其他主機地址欺騙攻擊。

在接受客戶端請求之前,包裝程序可以使用IDENT服務來發現客戶端根本沒有發送請求。 當客戶端主機提供IDENT服務時,負IDENT查詢結果(客戶端匹配`UNKNOWN @ host')是主機欺騙攻擊的有力證據。

積極的IDENT查找結果(客戶端匹配`KNOWN @ host')不太可靠。 入侵者可能欺騙客戶端連接和IDENT查找,儘管這樣做比欺騙客戶端連接困難得多。 也可能是客戶端的IDENT服務器在說謊。

注意:IDENT查找不適用於UDP服務。

例子

該語言足夠靈活,可以用最少的大驚小怪來表達不同類型的訪問控制策略。 雖然語言使用兩個訪問控製表,但最常見的策略可以通過其中一個表變得微不足道甚至為空來實現。

在閱讀下面的示例時,了解allow表在deny表之前被掃描是非常重要的,當搜索到匹配時搜索終止,並且在根本找不到匹配時授予訪問。

這些示例使用主機名和域名。 可以通過包含地址和/或網絡/網絡掩碼信息來改進它們,以減少臨時名稱服務器查找失敗的影響。

大部分已關閉

在這種情況下,訪問被默認拒絕。 只有明確授權的主機才被允許訪問。

默認策略(無權訪問)通過一個普通的拒絕文件實現:

/etc/hosts.deny:ALL:ALL

這會拒絕所有主機的所有服務,除非它們允許通過允許文件中的條目進行訪問。

明確授權的主機列在允許文件中。 例如:

/etc/hosts.allow:ALL:LOCAL @some_netgroup
ALL:.foobar.edu除了terminalserver.foobar.edu

第一條規則允許從本地域中的主機(主機名稱中不包含“。”)和some_netgroup網絡組成員進行訪問 。 第二個規則允許來自foob​​ar.edu域中的所有主機的訪問(注意前導點),但terminalserver.foobar.edu除外。

最開放

在此,默認授予訪問權限; 只有明確指定的主機被拒絕服務。

默認策略(授予的訪問權限)使得允許文件成為冗餘,因此可以省略。 明確的非授權主機列在拒絕文件中。 例如:

/etc/hosts.deny:ALL:some.host.name,.some.domain
除.ingerd以外的所有內容:other.host.name,.other.domain

第一條規則拒絕一些主機和域的所有服務; 第二條規則仍允許來自其他主機和域的指紋請求。

BOOBY TRAPS

下一個示例允許來自本地域中主機的tftp請求(注意前導點)。 來自其他主機的請求被拒絕。 而不是所請求的文件,手指探測器被發送到違規主機。 結果郵寄給超級用戶。

/etc/hosts.allow中:

in.tftpd:LOCAL,.my.domain /etc/hosts.deny:in.tftpd:ALL:spawn(/ some / where / safe_finger -l @%h | \ / usr / ucb / mail -s%d-% h根)&

safe_finger命令隨tcpd包裝器一起提供,應安裝在合適的位置。 它限制了遠程finger服務器發送的數據可能造成的損害。 它比標準的finger命令提供更好的保護。

有關shell命令的一節介紹了%h(客戶端主機)和%d(服務名稱)序列的擴展。

警告:除非你準備好了無限的手指循環,否則不要蠱惑你的手指守護進程。

在網絡防火牆系統上,這個技巧可以進一步發揮。 典型的網絡防火牆僅向外部世界提供有限的一組服務。 所有其他服務都可以像上面的tftp例子一樣被“竊聽”。 其結果是一個出色的預警系統。

也可以看看

tcpd(8)tcp / ip守護程序包裝程序。 tcpdchk(8),tcpdmatch(8),測試程序。

重要提示:使用man命令( %man )查看特定計算機上的命令使用方式。