ป้องกันคำสั่งทั้งหมดจากการถูกกำหนดเป็นนามแฝง


10

มีวิธีป้องกันไม่ให้คำสั่งทั้งหมดถูกกำหนดเป็นนามแฝงหรือไม่?

ตัวอย่างเช่นผู้ใช้ไม่สามารถกำหนดrmหรือคำสั่งอื่น ๆ (คำสั่งเริ่มต้นของ Ubuntu) เป็นชื่อนามแฝง


คุณหมายถึงอะไรกันแน่ คุณกำลังมองหาบางอย่างเช่น "บล็อกที่อ่อนนุ่ม" เพื่อป้องกันตัวเองจากการทำเช่นนั้นโดยบังเอิญ?
kos

4
ฉันไม่แน่ใจว่าเป็นสิ่งที่ทำเช่นนั้นแม้ว่ามันจะเป็นไปได้
muru

4
อะไรคือเหตุผลสำหรับสิ่งนี้ มันไม่ได้ป้องกันผู้ใช้จากการพิมพ์คำสั่งที่เกิดขึ้นจริง ... ดังนั้นฉันไม่เห็นเหตุผลที่ทุกคนต้องปิดกั้นนามแฝง?
Rinzwind

2
อย่างที่ muru และ Rinzwind พูดมีประเด็นอะไร? นามแฝงไม่สามารถทำสิ่งที่น่ารังเกียจกว่าสิ่งที่ผู้ใช้ได้รับอนุญาตแล้วการปิดกั้นนามแฝงเพียงทำให้ชีวิตของผู้ใช้ยากขึ้น ด้วยวิธีใดก็ตามที่โซลูชันจะใช้ (เช่นใช้นามแฝง / ฟังก์ชั่นเพื่อแทนที่บิวด์อิน) ฉันไม่สามารถคิดวิธีที่จะทำให้ผู้ใช้ไม่สามารถหลีกเลี่ยงได้เว้นแต่จะล็อค~/.bashrcไว้
kos

ไม่ปิดกั้นนามแฝงทั้งหมดเพียงป้องกันเขา / เธอที่จะไม่ใช้ชื่อคำสั่งเริ่มต้นเป็นชื่อนามแฝง ฉันรู้ว่าเราสามารถยกเว้นนามแฝงได้หลายวิธีเช่นการใช้ \ กับคำสั่ง aliased เดียวกันเพื่อรันคำสั่งจริง นั่นคือทั้งหมด
αғsнιη

คำตอบ:


24

ไม่มีวิธีที่คุณสามารถป้องกันผู้ใช้จากการกำหนดนามแฝงใด ๆ ที่พวกเขาต้องการ พิจารณา:

  1. /etc/bash.bashrcคุณปิดการใช้นามแฝงใน พวกเขาเปิดใช้งานได้ทุกที่ที่พวกเขาเลือกที่จะ
  2. คุณลบการกล่าวถึงนามแฝง/etc/bash.bashrcทั้งหมด~/.bashrcและทั้งหมดและ~/.bash_aliasesผ่านสคริปต์ พวกเขาวางนามแฝงของพวกเขาในไฟล์อื่นและแหล่งมัน
  3. คุณเรียกใช้คำสั่งPROMPT_COMMANDที่ปิดใช้งานนามแฝงบางอย่าง พวกเขา redefine หรือ PROMPT_COMMANDundefine
  4. คุณดักจับDEBUGและยกเลิกการกำหนดนามแฝง พวกเขาลบกับดัก
  5. คุณ chown ไฟล์ทั้งหมดที่มาจากการร้องขอเพื่อรูท พวกเขาใช้ไฟล์อื่นและแหล่งมันด้วยตนเองเป็นคำสั่งแรกที่พวกเขาทำงาน
  6. คุณปิดการใช้งาน builtins unset, builtinและenable; ทำaliasฟังก์ชั่น ; declare -rf aliasเพื่อป้องกันผู้ใช้จากการปรับเปลี่ยนฟังก์ชั่น; และส่งออกฟังก์ชั่น พวกเขาทำงาน/bin/bashด้วย--rcfileและ--init-fileเพื่อเริ่มเปลือกใหม่ที่กล่าวว่า builtins ตอนนี้เปิดใช้งาน
  7. ...

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


4
ฉันมีความคิดที่ตลกเล็กน้อย: คุณสามารถนามแฝงนามแฝง: =)
Rinzwind

4
unalias aliasและพวกเขา
muru

4
@muru แน่นอน แต่คุณสามารถ alias unalias: +
Rinzwind

8
@Rinzwind \unalias unaliasและพวกเขาทำงาน
muru

10

TL; DR

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

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

การใช้ Bash Restricted Shell

คุณสามารถใช้เชลล์ จำกัดของ Bash ได้โดยกำหนด rbash เป็นเชลล์ล็อกอินของผู้ใช้ ตัวอย่างเช่น:

foo:x:2001:2001:restricted user:/home/foo:/bin/rbash

จากนั้นคุณต้องปิดการใช้งานนามแฝงในตัวสำหรับผู้ใช้โดยเฉพาะอย่างยิ่งโดยไม่ทำลายเปลือกของคนอื่นด้วย ตัวอย่างเช่นคุณสามารถเพิ่มสิ่งต่อไปนี้ในไฟล์เช่น/etc/profile.d/rbash.sh :

# Limit effect to users in a specific UID range.
if ((UID >= 2000)) && ((UID < 3000)); then
    # Check shell options; disable alias builtins when shell is restricted.
    if [[ $- =~ r ]]; then
        enable -n alias
        enable -n unalias
    fi
fi

คำเตือน

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

นอกจากนี้โดยการออกแบบเชลล์ที่ จำกัด จะป้องกันกิจกรรมทั่วไปจำนวนมากเช่นการเปลี่ยนไดเร็กทอรี:

$ cd /tmp
rbash: cd: restricted

แต่ไม่ได้ป้องกันสคริปต์หรือโปรแกรมอื่น ๆ ในPATH ไม่ให้ทำเช่นนั้น ซึ่งหมายความว่าคุณต้องสร้างสภาพแวดล้อมของผู้ใช้อย่างระมัดระวังและโดยเฉพาะอย่างยิ่งคุณต้องป้องกันไม่ให้พวกเขาสามารถปรับเปลี่ยนPATHในไฟล์เริ่มต้นของพวกเขาเพราะแม้ว่า rbash ทำให้PATHอ่านอย่างเดียวหลังจากเริ่มต้น

ทางเลือกที่ดีกว่า

แม้ว่าคุณจะใช้ rbash คุณจะต้องทำเช่นนั้นเพื่อเป็นส่วนหนึ่งของชุดควบคุมที่กว้างขึ้น ตัวอย่างบางส่วนอาจรวมถึง:

  • ป้องกันไม่ให้ผู้ใช้ที่ไม่ใช่ทางด้านเทคนิคจากตั้งใจกล่าวอ้างคำสั่งที่เป็นอันตรายโดยการให้นามแฝงเริ่มต้นเช่นrm -i, mv -iและcp -iใน/etc/bash.bashrcไฟล์

    • จากตัวอย่างดั้งเดิมของคุณนี่อาจเป็นคำตอบที่เหมาะสมที่สุด
    • คุณสามารถรวมกับenable -n aliasถ้าคุณต้องการ
    • สิ่งนี้จะไม่ป้องกันผู้ใช้ที่มีความรู้ไม่ให้เปลี่ยนนามแฝง แต่อาจเพียงพอที่จะป้องกันผู้ใช้ที่ไม่ใช่ด้านเทคนิคจากการทำสิ่งที่คุณเป็นห่วง
  • สิทธิ์ Unix แบบดั้งเดิมหรือ POSIX ACLs เพื่อป้องกันไฟล์และไดเรกทอรี

  • เข้าสู่ระบบที่ดำเนินการคำสั่งที่ไม่ใช่แบบโต้ตอบเดียว ตัวอย่างเช่น:

    foo:x:2001:2001:run foo.sh:/home/foo:/usr/local/bin/foo.sh
  • ใช้คำสั่งบังคับ SSH ต่อคีย์ ตัวอย่างเช่น:

    # ~foo/.ssh/authorized_keys
    command="/usr/local/bin/foo.sh" [remainder of line]
  • ใช้ตัวเลือกOpenSSH ForceCommandกับบล็อกการจับคู่แบบมีเงื่อนไข

  • ใช้เครื่องมือพิเศษเช่นgitoliteหรือscponly ที่ออกแบบมาสำหรับกรณีการใช้งานเฉพาะของคุณ

  • ใช้คุก chroot

  • ใช้การจำลองเสมือนเช่น Xen, OpenVZ, LXC, VMware, VirtualBox หรือเทคโนโลยีอื่น ๆ เพื่อมอบสภาพแวดล้อมที่แยกออกจากกัน

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


+1 โดยทั่วไป แต่เฉพาะสำหรับการจำแนกประเภทนี้ว่าเป็นปัญหา X / Y
โจ

5

นี่เป็นความพยายามอย่างไม่มีจุดหมายเช่นเดียวกับที่คำตอบของอาจารย์แสดง แต่มีบางตัวเลือก แต่ไม่สมบูรณ์แบบ

ตามbashคู่มือฟังก์ชั่นจะมีความสำคัญมากกว่านามแฝงดังนั้นเราสามารถทำต่อไปนี้:

xieerqi@eagle:~$ function alias { echo "Aliases are no-no" ; }
xieerqi@eagle:~$ alias TEST='rm'
Aliases are no-no

คุณสามารถกำหนดฟังก์ชั่นลงใน systemwide .bashrcอย่างไรก็ตามในขณะที่ muru ชี้ให้เห็นผู้ใช้สมาร์ทจะหาวิธีที่จะได้รับนามแฝงโดยการจัดหาbashrcไฟล์ที่แตกต่างกันเช่น

ความคิดที่ฉันเล่นด้วยอีกอย่างคือenableในตัว aliasเป็นเชลล์ในตัวและbashมีenableคำสั่งที่ดีที่อนุญาตให้เปิดใช้งานหรือปิดการใช้งาน builtins aliasยกตัวอย่างเช่นที่นี่ฉันปิดการใช้งาน

xieerqi@eagle:~$ enable -n alias
xieerqi@eagle:~$ alias
No command 'alias' found, did you mean:
 Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ alias TEST='rm'
No command 'alias' found, did you mean:
 Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ enable alias
xieerqi@eagle:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
xieerqi@eagle:~$ 

อีกครั้งการใช้ทั้งระบบbashrcเป็นตัวเลือกที่นี่


ไม่ปิดกั้นนามแฝงทั้งหมดมีเพียงคำสั่งในตัวเท่านั้นที่ไม่ใช้นามแฝง :)
α

@ Afshin.Hamedi แล้วคำสั่งเริ่มต้นคืออะไร? อันที่มากับอูบุนตู? นั่นหมายความว่าคุณจะต้องมีรายการคำสั่งทั้งหมด (ไฟล์ไบนารี) ที่มาพร้อมกับการติดตั้งเริ่มต้น จากนั้นทุกครั้งที่ผู้ใช้โหลดเชลล์หรือพยายามที่จะนามแฝงบางสิ่งrmก็จะตรวจสอบรายการ เมื่อพิจารณาว่ารายการจะมีขนาดใหญ่มากมันจะใช้เวลานานในการเริ่มต้นผู้ใช้ของคุณจะบ่นกับคุณมากและเกลียดคุณในฐานะผู้ดูแลระบบ :)
Sergiy Kolodyazhnyy

มันเป็นคำถามที่สนุกและยอดเยี่ยมที่คุณมีฉันชอบมัน! การเลือกนามแฝงจะดี แต่ฉันสงสัยมันทำได้เว้นแต่นักพัฒนาเปลือกพบความจำเป็นเพื่อให้มีการดำเนินการ :)
Sergiy Kolodyazhnyy

แนวคิดของฟังก์ชั่นดีมาก มันเข้ามาใกล้ที่สุด
muru

0

คุณสามารถกำหนด (ใน/etc/profile) ฟังก์ชั่นที่เรียกว่าaliasการตรวจสอบที่คุณต้องการ (อาจจะใช้type -p) (หลังจากทั้งหมด "คำสั่งเริ่มต้นของ Ubuntu" คือ "executables ใน$PATH") ก่อนที่จะเรียก builtin alias, แต่เป็นคนอื่นได้ชี้ให้เห็น รอบ ๆ นั้น ทำไมไม่ได้รับกลุ่มผู้ใช้ที่แตกต่างกันหรือให้การศึกษาแก่พวกเขา ("การกำหนดaliasคำสั่งแทนที่คำสั่งนั้นเป็นวิธีที่ดีมากในการถ่ายภาพตัวเองที่เท้าและทำให้เกิดความสับสน (เช่นทำไมlsรหัสผ่านของฉัน?)?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.