มีวิธีป้องกันไม่ให้คำสั่งทั้งหมดถูกกำหนดเป็นนามแฝงหรือไม่?
ตัวอย่างเช่นผู้ใช้ไม่สามารถกำหนดrm
หรือคำสั่งอื่น ๆ (คำสั่งเริ่มต้นของ Ubuntu) เป็นชื่อนามแฝง
~/.bashrc
ไว้
มีวิธีป้องกันไม่ให้คำสั่งทั้งหมดถูกกำหนดเป็นนามแฝงหรือไม่?
ตัวอย่างเช่นผู้ใช้ไม่สามารถกำหนดrm
หรือคำสั่งอื่น ๆ (คำสั่งเริ่มต้นของ Ubuntu) เป็นชื่อนามแฝง
~/.bashrc
ไว้
คำตอบ:
ไม่มีวิธีที่คุณสามารถป้องกันผู้ใช้จากการกำหนดนามแฝงใด ๆ ที่พวกเขาต้องการ พิจารณา:
/etc/bash.bashrc
คุณปิดการใช้นามแฝงใน พวกเขาเปิดใช้งานได้ทุกที่ที่พวกเขาเลือกที่จะ/etc/bash.bashrc
ทั้งหมด~/.bashrc
และทั้งหมดและ~/.bash_aliases
ผ่านสคริปต์ พวกเขาวางนามแฝงของพวกเขาในไฟล์อื่นและแหล่งมันPROMPT_COMMAND
ที่ปิดใช้งานนามแฝงบางอย่าง พวกเขา redefine หรือ PROMPT_COMMAND
undefineDEBUG
และยกเลิกการกำหนดนามแฝง พวกเขาลบกับดักunset
, builtin
และenable
; ทำalias
ฟังก์ชั่น ; declare -rf alias
เพื่อป้องกันผู้ใช้จากการปรับเปลี่ยนฟังก์ชั่น; และส่งออกฟังก์ชั่น พวกเขาทำงาน/bin/bash
ด้วย--rcfile
และ--init-file
เพื่อเริ่มเปลือกใหม่ที่กล่าวว่า builtins ตอนนี้เปิดใช้งานคุณสามารถปิดการใช้งานนามแฝงในเวลารวบรวมจากนั้นมันก็ขึ้นอยู่กับคุณที่จะทุบตีให้ทันสมัยและให้แน่ใจว่าคุณไม่ได้รับผลกระทบจาก Shellshock ครั้งต่อไป แน่นอนผู้ใช้สามารถสร้างทุบตีของตัวเอง
unalias alias
และพวกเขา
\unalias unalias
และพวกเขาทำงาน
วิธีเดียวที่จะป้องกันไม่ให้ผู้ใช้สร้างนามแฝงคือจัดเตรียมเชลล์ที่ไม่สนับสนุนนามแฝง นี่เป็นปัญหา X / Y โดยที่ X เป็นรูปแบบการคุกคามที่ควรแก้ไขด้วยการควบคุมหรือสถาปัตยกรรมที่เหมาะสมแทนที่จะพยายามแก้ไขปัญหาหลังการทำจริงหลังจากผู้ใช้ได้รับเชลล์บนระบบที่ใช้ร่วมกัน
ด้านล่างนี้ฉันให้คำตอบที่ถูกต้องทางเทคนิครวมถึงคำแนะนำเกี่ยวกับปัญหาที่จะเกิดขึ้นและไม่สามารถแก้ไขได้ ฉันยังให้คำแนะนำเพิ่มเติมเกี่ยวกับการควบคุมทางเลือก
คุณสามารถใช้เชลล์ จำกัดของ 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 หรือเทคโนโลยีอื่น ๆ เพื่อมอบสภาพแวดล้อมที่แยกออกจากกัน
เมื่อคุณกำหนดรูปแบบการคุกคามได้อย่างถูกต้องแล้วคุณสามารถระบุการควบคุมที่เหมาะสมที่สุดสำหรับกรณีการใช้งานของคุณ หากไม่มีความเข้าใจที่มีความหมายมากขึ้นเกี่ยวกับสาเหตุที่คุณต้องการป้องกันนามแฝง (เช่นปัญหาในโลกแห่งความจริงแก้ปัญหาได้อย่างไร) คุณไม่สามารถเลือกการควบคุมที่เหมาะสมที่สุดได้
นี่เป็นความพยายามอย่างไม่มีจุดหมายเช่นเดียวกับที่คำตอบของอาจารย์แสดง แต่มีบางตัวเลือก แต่ไม่สมบูรณ์แบบ
ตาม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
เป็นตัวเลือกที่นี่
rm
ก็จะตรวจสอบรายการ เมื่อพิจารณาว่ารายการจะมีขนาดใหญ่มากมันจะใช้เวลานานในการเริ่มต้นผู้ใช้ของคุณจะบ่นกับคุณมากและเกลียดคุณในฐานะผู้ดูแลระบบ :)
คุณสามารถกำหนด (ใน/etc/profile
) ฟังก์ชั่นที่เรียกว่าalias
การตรวจสอบที่คุณต้องการ (อาจจะใช้type -p
) (หลังจากทั้งหมด "คำสั่งเริ่มต้นของ Ubuntu" คือ "executables ใน$PATH
") ก่อนที่จะเรียก builtin alias
, แต่เป็นคนอื่นได้ชี้ให้เห็น รอบ ๆ นั้น ทำไมไม่ได้รับกลุ่มผู้ใช้ที่แตกต่างกันหรือให้การศึกษาแก่พวกเขา ("การกำหนดalias
คำสั่งแทนที่คำสั่งนั้นเป็นวิธีที่ดีมากในการถ่ายภาพตัวเองที่เท้าและทำให้เกิดความสับสน (เช่นทำไมls
รหัสผ่านของฉัน?)?