Hosts.allow – คำสั่ง Linux

ค้นหาโฮสต์ที่ได้รับอนุญาตของคุณ

คุณอาจมาถึงที่นี่เพื่อหาวิธีดูโฮสต์ (คอมพิวเตอร์เครื่องอื่น) ที่ได้รับอนุญาตให้เข้าถึง ลินุกซ์ ระบบ. เว้นแต่คุณจะตั้งค่าการจำกัดไว้แล้ว อาจเป็นคอมพิวเตอร์เครื่องใดก็ตามที่พยายามตามค่าเริ่มต้น

อันที่จริงนั่นไม่เป็นความจริงทั้งหมด หากไม่มีกฎที่กำหนดไว้ในไฟล์ /etc/hosts.allow หรือไฟล์ /etc/hosts.deny คอมพิวเตอร์ของคุณจะส่งต่อการเชื่อมต่อไปยังแอปพลิเคชันที่เกี่ยวข้อง ดังนั้นหากใครพยายามจะเชื่อมต่อผ่าน SSHการเชื่อมต่อจะมาถึงระบบ Linux ของคุณซึ่งจะถูกส่งไปยัง SSH เพื่อเข้าสู่ระบบ หากไม่ได้ระบุข้อมูลประจำตัวที่ถูกต้อง การเชื่อมต่อจะถูกปฏิเสธ

หากบางโฮสต์ได้รับอนุญาตหรือถูกปฏิเสธ อันดับแรก Linux จะตรวจสอบกฎเหล่านั้นเพื่อดูว่าคำขอที่เข้ามาควรได้รับอนุญาตผ่านหรือไม่ แล้วมันก็จะเป็นไปตามแบบเดิม

คุณสามารถตรวจสอบโฮสต์ที่อนุญาตได้โดยการแสดงรายการเนื้อหาของไฟล์ /etc/hosts.allow

cat /etc/hosts.allow. 

หากคุณไม่เห็นสิ่งใดที่นั่น ระบบของคุณอาจยอมให้การเชื่อมต่อใดๆ ผ่านได้

ผู้ชายกำลังใช้คอมพิวเตอร์ในสำนักงาน
 รูปภาพ Yuri_Arcurs / Getty

การใช้ไฟล์ Hosts.allow

ไฟล์ /etc/hosts.allow ให้คุณเลือกว่าคอมพิวเตอร์เครื่องใดที่สามารถเข้าถึงระบบของคุณได้ ในไฟล์ คุณสามารถระบุกฎง่ายๆ เป็นข้อความธรรมดาเพื่อบอกให้คอมพิวเตอร์ทราบวิธีจัดการการเชื่อมต่อ ในการเริ่มต้น ให้สร้างกฎที่อนุญาตให้คอมพิวเตอร์ทุกเครื่องรับบริการทั้งหมด

ทั้งหมด: ทั้งหมด 

มันง่ายมาก ถ้าคุณต้องการแยกคอมพิวเตอร์ที่มีปัญหาออก คุณก็สามารถทำได้เช่นกัน

ทั้งหมด: ทั้งหมด ยกเว้น 192.168.1.110 

มีคีย์เวิร์ดอื่นๆ อีกหลายคำที่คุณสามารถใช้จัดการกับคอมพิวเตอร์ชุดต่างๆ ได้ ตัวอย่างเช่น คุณสามารถอนุญาตการรับส่งข้อมูลในท้องถิ่นทั้งหมดในลักษณะนี้:

ทั้งหมด: 192.168.1.0/24 

หรือคุณสามารถใช้คำหลัก "LOCAL" แทน

ทั้งหมด: ท้องถิ่น 

คุณยังสามารถใช้ชื่อโดเมนได้ ตัวอย่างเช่น:

ทั้งหมด: .example.com 

คุณสามารถใช้คำหลัก "ยกเว้น" ที่นี่ได้เช่นกันเพื่อยกเว้นโดเมนย่อยที่อาจมีปัญหา

ทั้งหมด: .example.com ยกเว้น testing.example.com 

คุณยังสามารถระบุกฎสำหรับภูตเฉพาะ ดังนั้น หากคุณต้องการควบคุมการเข้าถึง SSH คุณจะต้องตั้งกฎสำหรับ 'sshd'

sshd: ท้องถิ่น 

ไฟล์ hosts.allow รองรับการแสดงรายการ daemons ในบรรทัดเดียวกัน หากกฎของพวกมันเหมือนกัน ตัวอย่างเช่น:

sshd, in.ftpd: LOCAL 

สังเกต "ใน" มีส่วนร่วมใน "in.ftpd?" ที่ช่วยให้คุณระบุการรับส่งข้อมูลขาเข้า

จากนั้น คุณมีตัวเลือกในการรวบรวมทั้งหมด

sshd, in.ftpd: LOCAL ยกเว้น 192.168.1.110 

นี่คือวิธีทั่วไปที่คุณใช้ไฟล์ /etc/hosts.allow บนระบบ Linux ของคุณ สำหรับรายละเอียดทางเทคนิคทั้งหมดเกี่ยวกับสิ่งที่คุณสามารถทำได้กับไฟล์ /etc/hosts.allow ให้ไปต่อในหัวข้อถัดไป

รายละเอียดทางเทคนิค

หน้าคู่มือนี้อธิบาย Linux ว่าเป็นภาษาควบคุมการเข้าใช้งานอย่างง่ายที่อิงตามไคลเอนต์ (ชื่อโฮสต์/ที่อยู่ ชื่อผู้ใช้) และ เซิร์ฟเวอร์ (ชื่อกระบวนการ ชื่อโฮสต์/ที่อยู่) รูปแบบ ตัวอย่างจะได้รับในตอนท้าย ผู้อ่านที่ใจร้อนควรข้ามไปที่ส่วนตัวอย่างเพื่อแนะนำโดยย่อ เวอร์ชันเพิ่มเติมของภาษาควบคุมการเข้าถึงมีอธิบายไว้ใน hosts_options (5) เอกสาร ส่วนขยายจะเปิดขึ้นในเวลาสร้างโปรแกรมโดยสร้างด้วย —DPROCESS_OPTIONS

ในข้อความต่อไปนี้ ภูต เป็นชื่อโปรเซสของโปรเซสเน็ตเวิร์ก daemon และ ลูกค้า คือชื่อและ/หรือที่อยู่ของโฮสต์ที่ขอรับบริการ ชื่อกระบวนการ Network daemon ถูกระบุในไฟล์คอนฟิกูเรชัน inetd

ไฟล์ควบคุมการเข้าถึง

ซอฟต์แวร์ควบคุมการเข้าใช้ปรึกษาสอง ไฟล์. การค้นหาจะหยุดที่นัดแรก

การเข้าถึงจะได้รับเมื่อคู่ (daemon, ไคลเอนต์) ตรงกับรายการใน /etc/hosts.allowไฟล์.

มิฉะนั้น การเข้าถึงจะถูกปฏิเสธเมื่อคู่ (daemon, client) ตรงกับรายการใน/etc/hosts.deny ไฟล์.

มิฉะนั้นจะได้รับอนุญาต

ไฟล์ควบคุมการเข้าถึงที่ไม่มีอยู่จะถือว่าไฟล์นั้นเป็นไฟล์ว่าง ดังนั้น การควบคุมการเข้าถึงสามารถปิดได้โดยไม่มีไฟล์ควบคุมการเข้าถึง

กฎการควบคุมการเข้าถึง

ไฟล์ควบคุมการเข้าถึงแต่ละไฟล์ประกอบด้วยข้อความศูนย์หรือมากกว่า เส้นเหล่านี้ได้รับการประมวลผลตามลำดับลักษณะที่ปรากฏ การค้นหาจะสิ้นสุดลงเมื่อพบรายการที่ตรงกัน

อักขระขึ้นบรรทัดใหม่จะถูกละเว้นเมื่อนำหน้าด้วยอักขระแบ็กสแลช วิธีนี้ทำให้คุณสามารถแยกบรรทัดยาวๆ เพื่อให้ง่ายต่อการแก้ไข

บรรทัดว่างหรือบรรทัดที่ขึ้นต้นด้วยอักขระ `#' จะถูกละเว้น อนุญาตให้คุณแทรกความคิดเห็นและช่องว่างเพื่อให้อ่านตารางได้ง่ายขึ้น

บรรทัดอื่นๆ ทั้งหมดควรเป็นไปตามรูปแบบต่อไปนี้ ระหว่าง [] จะเป็นทางเลือก:

daemon_list: client_list [: shell_command ]

daemon_list คือรายชื่อโปรเซสของ daemon อย่างน้อยหนึ่งชื่อ (ค่า argv[0]) หรืออักขระตัวแทน (ดูด้านล่าง)

client_list คือรายชื่อโฮสต์ ที่อยู่โฮสต์ รูปแบบ หรือสัญลักษณ์แทนอย่างน้อยหนึ่งชื่อ (ดูด้านล่าง) ที่จะจับคู่กับชื่อหรือที่อยู่โฮสต์ของไคลเอ็นต์

รูปแบบที่ซับซ้อนมากขึ้น daemon@host และ ผู้ใช้@โฮสต์ มีการอธิบายในส่วนต่างๆ เกี่ยวกับรูปแบบปลายทางของเซิร์ฟเวอร์และการค้นหาชื่อผู้ใช้ของไคลเอ็นต์ตามลำดับ

องค์ประกอบรายการควรคั่นด้วยช่องว่างและ/หรือเครื่องหมายจุลภาค

ยกเว้น NIS (YP) การค้นหากลุ่มเครือข่าย, การตรวจสอบการควบคุมการเข้าถึงทั้งหมดไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

รูปแบบ

ภาษาควบคุมการเข้าถึงใช้รูปแบบต่อไปนี้:

สตริงที่ขึ้นต้นด้วย `.' อักขระ. ชื่อโฮสต์จะตรงกันถ้าองค์ประกอบสุดท้ายของชื่อตรงกับรูปแบบที่ระบุ ตัวอย่างเช่น รูปแบบ `.tue.nl' ตรงกับชื่อโฮสต์ `wzv.win.tue.nl'

สตริงที่ลงท้ายด้วย `.' อักขระ. ที่อยู่โฮสต์จะตรงกันถ้าฟิลด์ตัวเลขแรกตรงกับสตริงที่ระบุ ตัวอย่างเช่น รูปแบบ `131.155.' ตรงกับที่อยู่ของ (เกือบ) ทุกโฮสต์ในเครือข่าย Eindhoven University (131.155.x.x)

สตริงที่ขึ้นต้นด้วยอักขระ `@' จะถือเป็นชื่อเน็ตกรุ๊ปของ ​​NIS (เดิมคือ YP) NS ชื่อโฮสต์ จะถูกจับคู่หากเป็นสมาชิกโฮสต์ของ netgroup ที่ระบุ ไม่สนับสนุนการจับคู่ Netgroup สำหรับชื่อโปรเซส daemon หรือชื่อผู้ใช้ไคลเอ็นต์

นิพจน์ของรูปแบบ `n.n.n.n/m.m.m.m' จะถูกตีความว่าเป็นคู่ `net/mask' ที่อยู่โฮสต์ IPv4 จะถูกจับคู่หาก "net" เท่ากับระดับบิตและของที่อยู่และ "มาสก์" ตัวอย่างเช่น รูปแบบเน็ต/มาสก์ `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' ที่อยู่โฮสต์ IPv6 จะถูกจับคู่หากบิต "prefixlen" ของ "net" เท่ากับบิต "prefixlen" ของที่อยู่ ตัวอย่างเช่น [net]/รูปแบบคำนำหน้า `[3ffe: 505:2:1::]/64' จะจับคู่ทุกที่อยู่ในช่วง `3ffe: 505:2:1::' ถึง `3ffe: 505:2: 1:ffff: ffff: ffff: ffff'

สตริงที่ขึ้นต้นด้วยอักขระ `/' จะถือว่าเป็น a ชื่อไฟล์. ชื่อโฮสต์หรือที่อยู่จะตรงกันหากตรงกับชื่อโฮสต์หรือรูปแบบที่อยู่ที่ระบุไว้ในไฟล์ที่มีชื่อ รูปแบบไฟล์เป็นศูนย์หรือมากกว่าบรรทัดที่มีชื่อโฮสต์หรือรูปแบบที่อยู่คั่นด้วยช่องว่าง รูปแบบชื่อไฟล์สามารถใช้ได้ทุกที่ที่ชื่อโฮสต์หรือรูปแบบที่อยู่สามารถใช้ได้

สัญลักษณ์แทน `*' และ `?' สามารถใช้เพื่อจับคู่ชื่อโฮสต์หรือ ที่อยู่ IP. วิธีการจับคู่นี้ไม่สามารถใช้ร่วมกับการจับคู่ `net/mask' การจับคู่ชื่อโฮสต์ที่ขึ้นต้นด้วย `.' หรือที่อยู่ IP ที่ตรงกันที่ลงท้ายด้วย `.'

ไวด์การ์ด

ภาษาควบคุมการเข้าถึงรองรับไวด์การ์ดที่ชัดเจน ได้แก่:

  • 'ทั้งหมด' — ไวลด์การ์ดสากล ตรงกันเสมอ
  • 'ท้องถิ่น' —จับคู่โฮสต์ที่มีชื่อไม่มีอักขระจุด
  • 'ไม่รู้จัก' —จับคู่ผู้ใช้ที่ไม่รู้จักชื่อ และตรงกับโฮสต์ใดๆ ที่มีชื่อ หรือ ไม่ทราบที่อยู่ ควรใช้รูปแบบนี้อย่างระมัดระวัง: ชื่อโฮสต์อาจไม่พร้อมใช้งานเนื่องจากปัญหาเซิร์ฟเวอร์ชื่อชั่วคราว NS ที่อยู่เครือข่าย จะไม่สามารถใช้งานได้เมื่อซอฟต์แวร์ไม่สามารถระบุได้ว่ากำลังคุยอยู่กับเครือข่ายประเภทใด
  • 'เป็นที่รู้จัก' —จับคู่ผู้ใช้ที่รู้จักชื่อและตรงกับโฮสต์ที่มีชื่อ และ ที่อยู่เป็นที่รู้จัก ควรใช้รูปแบบนี้อย่างระมัดระวัง: ชื่อโฮสต์อาจไม่พร้อมใช้งานเนื่องจากปัญหาเซิร์ฟเวอร์ชื่อชั่วคราว ที่อยู่เครือข่ายจะใช้ไม่ได้เมื่อซอฟต์แวร์ไม่สามารถระบุได้ว่ากำลังคุยอยู่กับเครือข่ายประเภทใด
  • 'หวาดระแวง' —ตรงกับโฮสต์ที่มีชื่อไม่ตรงกับที่อยู่ เมื่อ tcpd ถูกสร้างด้วย -DPARANOID (โหมดเริ่มต้น) มันจะลบคำขอจากไคลเอนต์ดังกล่าว แม้กระทั่งก่อนที่จะดูตารางการควบคุมการเข้าถึง สร้างโดยไม่มี -DPARANOID เมื่อคุณต้องการควบคุมคำขอดังกล่าวมากขึ้น

'ผู้ประกอบการ'

  • 'ยกเว้น' —ตั้งใจใช้อยู่ในรูปแบบ: `list_1 ยกเว้น list_2'; โครงสร้างนี้ตรงกับสิ่งที่ตรงกับ list_1 เว้นแต่จะตรงกัน list_2. สามารถใช้ตัวดำเนินการ EXCEPT ใน daemon_lists และใน client_lists ตัวดำเนินการ EXCEPT สามารถซ้อนกันได้: หากภาษาควบคุมอนุญาตให้ใช้วงเล็บ `a EXCEPT b EXCEPT c' จะแยกวิเคราะห์เป็น `(a EXCEPT (b EXCEPT c))'
  • คำสั่งเชลล์ —หากกฎการควบคุมการเข้าถึงที่ตรงกันครั้งแรกมีคำสั่งเชลล์ คำสั่งนั้นจะอยู่ภายใต้ %substitutions (ดูหัวข้อถัดไป) ผลลัพธ์ถูกดำเนินการโดย a /bin/sh กระบวนการลูกที่มีอินพุต เอาต์พุต และข้อผิดพลาดมาตรฐานเชื่อมต่อกับ /dev/null. ระบุ `&' ที่ส่วนท้ายของ คำสั่งเทอร์มินัล ถ้าไม่อยากรอจนเสร็จ คำสั่งเชลล์ไม่ควรอาศัยการตั้งค่า PATH ของ inetd แต่ควรใช้ชื่อพาธแบบสัมบูรณ์ หรือควรขึ้นต้นด้วย PATH=whatever ที่ชัดเจน

NS hosts_options(5) เอกสารอธิบายภาษาอื่นที่ใช้ฟิลด์คำสั่งเชลล์ในลักษณะที่แตกต่างและเข้ากันไม่ได้

% การขยาย

ส่วนขยายต่อไปนี้มีอยู่ในคำสั่งเชลล์:

  • %a (%A) — ลูกค้า (เซิร์ฟเวอร์) เจ้าภาพ ที่อยู่.
  • %ค — ข้อมูลลูกค้า: user@host, user@address, ชื่อโฮสต์ หรือเพียงแค่ที่อยู่ ขึ้นอยู่กับจำนวนข้อมูลที่มี
  • %NS — ชื่อกระบวนการ daemon (ค่า argv[0])
  • % ชม. (% ชม.) — ชื่อโฮสต์หรือที่อยู่โฮสต์ของไคลเอ็นต์ (เซิร์ฟเวอร์) หากชื่อโฮสต์ไม่พร้อมใช้งาน
  • %n (%N) — ชื่อโฮสต์ไคลเอนต์ (เซิร์ฟเวอร์) (หรือ "ไม่รู้จัก" หรือ "หวาดระแวง")
  • %NS — รหัสกระบวนการภูต
  • %NS — ข้อมูลเซิร์ฟเวอร์: daemon@host, daemon@address หรือเพียงแค่ชื่อ daemon ขึ้นอยู่กับจำนวนข้อมูลที่มี
  • %ยู — ชื่อผู้ใช้ไคลเอนต์ (หรือ "ไม่รู้จัก")
  • %% — ขยายเป็นอักขระ `%' ตัวเดียว

อักขระในการขยาย% ที่อาจสร้างความสับสนให้กับเชลล์จะถูกแทนที่ด้วยขีดล่าง

รูปแบบปลายทางของเซิร์ฟเวอร์

ในการแยกแยะไคลเอ็นต์ตามที่อยู่เครือข่ายที่พวกเขาเชื่อมต่อ ให้ใช้รูปแบบของแบบฟอร์ม:

process_name@host_pattern: client_list... 

รูปแบบเช่นนี้สามารถใช้ได้เมื่อเครื่องมีที่อยู่อินเทอร์เน็ตที่แตกต่างกันโดยมีชื่อโฮสต์อินเทอร์เน็ตต่างกัน ผู้ให้บริการสามารถใช้สิ่งอำนวยความสะดวกนี้เพื่อเสนอไฟล์เก็บถาวร FTP, GOPHER หรือ WWW ที่มีชื่ออินเทอร์เน็ตที่อาจเป็นขององค์กรอื่น โปรดดูตัวเลือก "บิด" ในเอกสาร hosts_options (5) บางระบบ (Solaris, FreeBSD) สามารถมีที่อยู่อินเทอร์เน็ตได้มากกว่าหนึ่งที่อยู่บนอินเทอร์เฟซทางกายภาพเดียว กับระบบอื่นๆ คุณอาจต้องใช้อินเทอร์เฟซหลอกแบบ SLIP หรือ PPP ที่อาศัยอยู่ในพื้นที่ที่อยู่เครือข่ายเฉพาะ

host_pattern เป็นไปตามกฎไวยากรณ์เดียวกันกับชื่อโฮสต์และที่อยู่ในบริบท client_list โดยปกติ ข้อมูลปลายทางของเซิร์ฟเวอร์จะใช้ได้เฉพาะกับบริการที่เน้นการเชื่อมต่อเท่านั้น

การค้นหาชื่อผู้ใช้ของลูกค้า

เมื่อโฮสต์ไคลเอ็นต์สนับสนุนโปรโตคอล RFC 931 หรือหนึ่งในรุ่นย่อย (TAP, IDENT, RFC 1413) โปรแกรม wrapper สามารถดึงข้อมูลเพิ่มเติมเกี่ยวกับเจ้าของการเชื่อมต่อได้ ข้อมูลชื่อผู้ใช้ของไคลเอ็นต์ (ถ้ามี) จะถูกบันทึกพร้อมกับชื่อโฮสต์ของไคลเอ็นต์ และสามารถใช้เพื่อจับคู่รูปแบบต่างๆ เช่น:

daemon_list:... user_pattern@host_pattern... 

daemon wrappers สามารถกำหนดค่าได้ในเวลาคอมไพล์เพื่อดำเนินการค้นหาชื่อผู้ใช้ที่เป็นไปตามกฎ (ค่าเริ่มต้น) หรือเพื่อสอบถามโฮสต์ไคลเอ็นต์เสมอ ในกรณีของการค้นหาชื่อผู้ใช้ที่เป็นไปตามกฎ กฎข้างต้นจะทำให้ค้นหาชื่อผู้ใช้ก็ต่อเมื่อทั้ง daemon_list และ host_patternจับคู่.

รูปแบบผู้ใช้มีไวยากรณ์เดียวกันกับรูปแบบกระบวนการ daemon ดังนั้นจึงใช้สัญลักษณ์แทนเดียวกัน (ไม่รองรับการเป็นสมาชิก netgroup) ไม่ควรมองข้ามการค้นหาชื่อผู้ใช้

ข้อมูลชื่อผู้ใช้ของไคลเอ็นต์ไม่สามารถเชื่อถือได้เมื่อมีความจำเป็นมากที่สุด เช่น เมื่อระบบไคลเอ็นต์ถูกบุกรุก โดยทั่วไป ALL และ (UN)KNOWN เป็นรูปแบบชื่อผู้ใช้เพียงรูปแบบเดียวที่สมเหตุสมผล

การค้นหาชื่อผู้ใช้ทำได้เฉพาะกับบริการที่ใช้ TCP และเฉพาะเมื่อโฮสต์ไคลเอ็นต์รัน daemon ที่เหมาะสมเท่านั้น ในกรณีอื่นๆ ผลลัพธ์จะเป็น "ไม่ทราบ"

ที่รู้จักกันดี UNIX ข้อบกพร่องของเคอร์เนลอาจทำให้บริการสูญหายเมื่อการค้นหาชื่อผู้ใช้ถูกบล็อกโดยไฟร์วอลล์ เอกสาร wrapper README อธิบายขั้นตอนเพื่อดูว่าเคอร์เนลของคุณมีจุดบกพร่องนี้หรือไม่

การค้นหาชื่อผู้ใช้อาจทำให้เกิดความล่าช้าอย่างเห็นได้ชัดสำหรับผู้ใช้ที่ไม่ใช่ UNIX ระยะหมดเวลาเริ่มต้นสำหรับการค้นหาชื่อผู้ใช้คือ 10 วินาที: สั้นเกินไปที่จะรับมือกับเครือข่ายที่ช้า แต่นานพอที่จะทำให้ผู้ใช้พีซีระคายเคือง

การค้นหาชื่อผู้ใช้แบบเลือกสามารถบรรเทาปัญหาสุดท้ายได้ ตัวอย่างเช่น กฎเช่น:

daemon_list: @pcnetgroup ALL@ALL. 

จะจับคู่สมาชิกของ pc netgroup โดยไม่ต้องทำการค้นหาชื่อผู้ใช้ แต่จะทำการค้นหาชื่อผู้ใช้กับระบบอื่นๆ ทั้งหมด

การตรวจจับที่อยู่การปลอมแปลงการโจมตี

ข้อบกพร่องในเครื่องกำเนิดหมายเลขลำดับของหลาย ๆ การใช้งาน TCP/IP อนุญาตให้ผู้บุกรุกปลอมแปลงเป็นโฮสต์ที่เชื่อถือได้และเจาะเข้าไป เช่น บริการรีโมตเชลล์ บริการ IDENT (RFC931 เป็นต้น) สามารถใช้เพื่อตรวจจับการโจมตีดังกล่าวและการโจมตีด้วยการปลอมแปลงที่อยู่โฮสต์อื่นๆ

ก่อนที่จะยอมรับคำขอของไคลเอ็นต์ Wrapper สามารถใช้บริการ IDENT เพื่อค้นหาว่าไคลเอ็นต์ไม่ได้ส่งคำขอเลย เมื่อโฮสต์ไคลเอนต์ให้บริการ IDENT ผลลัพธ์การค้นหา IDENT เชิงลบ (ไคลเอนต์ตรงกับ `UNKNOWN@host') จะเป็นหลักฐานที่ชัดเจนว่าโฮสต์โจมตีปลอมแปลง

ผลลัพธ์การค้นหา IDENT ในเชิงบวก (ไคลเอนต์ตรงกับ `KNOWN@host') มีความน่าเชื่อถือน้อยกว่า เป็นไปได้ที่ผู้บุกรุกจะปลอมแปลงทั้งการเชื่อมต่อไคลเอ็นต์และการค้นหา IDENT แม้ว่าการทำเช่นนั้นจะยากกว่าการปลอมแปลงเพียงแค่การเชื่อมต่อไคลเอ็นต์ อาจเป็นไปได้ว่าเซิร์ฟเวอร์ IDENT ของลูกค้ากำลังโกหก

การค้นหา IDENT ไม่สามารถใช้ได้กับบริการ UDP

ตัวอย่างเพิ่มเติม

ภาษามีความยืดหยุ่นเพียงพอที่จะแสดงนโยบายการควบคุมการเข้าถึงประเภทต่างๆ ได้โดยไม่ยุ่งยาก แม้ว่าภาษาจะใช้ตารางควบคุมการเข้าถึงสองตาราง แต่นโยบายทั่วไปส่วนใหญ่สามารถนำไปใช้กับตารางใดตารางหนึ่งที่ไม่สำคัญหรือแม้แต่ว่างเปล่า

เมื่ออ่านตัวอย่างด้านล่าง สิ่งสำคัญคือต้องตระหนักว่าตารางการอนุญาตถูกสแกนก่อนที่จะปฏิเสธ ตาราง การค้นหาจะสิ้นสุดลงเมื่อพบรายการที่ตรงกัน และการเข้าถึงนั้นจะได้รับเมื่อไม่พบรายการที่ตรงกันที่ ทั้งหมด.

ตัวอย่างใช้ชื่อโฮสต์และโดเมน สามารถปรับปรุงได้โดยการรวมที่อยู่และ/หรือข้อมูลเครือข่าย/เน็ตมาสก์ เพื่อลดผลกระทบของความล้มเหลวในการค้นหาเซิร์ฟเวอร์ชื่อชั่วคราว

ส่วนใหญ่ปิด

ในกรณีนี้ การเข้าถึงจะถูกปฏิเสธโดยค่าเริ่มต้น อนุญาตให้เข้าถึงได้เฉพาะโฮสต์ที่ได้รับอนุญาตอย่างชัดเจนเท่านั้น

นโยบายเริ่มต้น (ไม่มีการเข้าถึง) ใช้กับไฟล์ปฏิเสธเล็กน้อย:

/etc/hosts.deny:

ทั้งหมด: ทั้งหมด 

การดำเนินการนี้จะปฏิเสธบริการทั้งหมดสำหรับโฮสต์ทั้งหมด เว้นแต่จะได้รับอนุญาตให้เข้าถึงโดยรายการในไฟล์อนุญาต

โฮสต์ที่ได้รับอนุญาตอย่างชัดเจนจะแสดงอยู่ในไฟล์อนุญาต ตัวอย่างเช่น:

/etc/hosts.allow:

ทั้งหมด: LOCAL @some_netgroup
ทั้งหมด: .foobar.edu ยกเว้น terminalserver.foobar.edu

กฎข้อแรกอนุญาตการเข้าถึงจากโฮสต์ใน โดเมนท้องถิ่น (ไม่มี `.' ในชื่อโฮสต์) และจากสมาชิกของ some_netgroup เน็ตกรุ๊ป กฎข้อที่สองอนุญาตการเข้าถึงจากโฮสต์ทั้งหมดในfoobar.edu โดเมน (สังเกตจุดนำหน้า) ยกเว้น terminalserver.foobar.edu.

ส่วนใหญ่เปิด

ที่นี่ การเข้าถึงจะได้รับตามค่าเริ่มต้น เฉพาะโฮสต์ที่ระบุอย่างชัดเจนเท่านั้นที่จะถูกปฏิเสธการให้บริการ

นโยบายเริ่มต้น (อนุญาตการเข้าถึง) ทำให้ไฟล์อนุญาตซ้ำซ้อนเพื่อให้สามารถละเว้นได้ โฮสต์ที่ไม่ได้รับอนุญาตอย่างชัดเจนจะแสดงอยู่ในไฟล์ปฏิเสธ ตัวอย่างเช่น:

/etc/hosts.deny:

ทั้งหมด: some.host.name, .some.domain
ทั้งหมด: ทั้งหมด ยกเว้น in.fingerd: other.host.name, .other.domain

กฎข้อแรกปฏิเสธบางโฮสต์และโดเมนบริการทั้งหมด กฎข้อที่สองยังคงอนุญาตการร้องขอนิ้วจากโฮสต์และโดเมนอื่น

Booby Traps

ตัวอย่างต่อไปอนุญาต คำขอtftp จากโฮสต์ในโดเมนท้องถิ่น (สังเกตจุดนำหน้า) คำขอจากโฮสต์อื่น ๆ จะถูกปฏิเสธ แทนที่จะส่งไฟล์ที่ร้องขอ โพรบนิ้วจะถูกส่งไปยังโฮสต์ที่ละเมิด ผลลัพธ์จะถูกส่งไปยัง superuser

/etc/hosts.allow:

in.tftpd: LOCAL, .my.domain
/etc/hosts.deny:
in.tftpd: ทั้งหมด: spawn (/some/where/safe_finger -l @%h | \
/usr/ucb/mail -s %d-%h รูท) &

คำสั่ง safe_finger มาพร้อมกับ tcpd wrapper และควรติดตั้งในตำแหน่งที่เหมาะสม มันจำกัดความเสียหายที่อาจเกิดขึ้นจากข้อมูลที่ส่งโดยเซิร์ฟเวอร์นิ้วระยะไกล ให้การปกป้องได้ดีกว่าคำสั่งนิ้วมาตรฐาน

การขยายลำดับ %h (โฮสต์ไคลเอ็นต์) และ %d (ชื่อบริการ) มีการอธิบายไว้ในส่วนคำสั่งเชลล์

อย่าดักจับ finger daemon ของคุณ เว้นแต่ว่าคุณพร้อมสำหรับการวนซ้ำแบบไม่มีที่สิ้นสุด

บนเครือข่าย ระบบไฟร์วอลล์ เคล็ดลับนี้สามารถดำเนินการได้ดียิ่งขึ้น ไฟร์วอลล์เครือข่ายทั่วไปมีชุดบริการที่จำกัดแก่โลกภายนอกเท่านั้น บริการอื่น ๆ ทั้งหมดสามารถ "บั๊ก" ได้เช่นเดียวกับตัวอย่าง tftp ด้านบน ผลที่ได้คือระบบการเตือนล่วงหน้าที่ยอดเยี่ยม

ดูสิ่งนี้ด้วย

tcpd (8) โปรแกรมห่อ tcp/ip daemon
tcpdchk (8), tcpdmatch (8), โปรแกรมทดสอบ

ใช้ ชาย สั่งการ (% ชาย) เพื่อดูวิธีการใช้คำสั่งบนคอมพิวเตอร์เฉพาะของคุณ