บล็อกคำสั่งเฉพาะใน Linux สำหรับผู้ใช้เฉพาะ


27

วิธีการบล็อกคำสั่งสมมติว่าmkdirสำหรับผู้ใช้ที่เฉพาะเจาะจง

สิ่งที่ฉันเพิ่งสร้างฟังก์ชั่นอ่านอย่างเดียวและเก็บไว้ในโปรไฟล์ผู้ใช้ ~/.bashrc

/bin/mkdir() {
        echo "mkdir command not allow for you"

}

mkdir() {
        echo "mkdir command not allow for you"

}
./mkdir() {

        echo "mkdir command not allow for you"
}

readonly -f /bin/mkdir
readonly -f mkdir
readonly -f ./mkdir

ทดสอบ:

rahul@ubuntu:~$ cd /bin/
rahul@ubuntu:/bin$ ./mkdir /home/rahul/ggg
mkdir command not allow for you
rahul@ubuntu:/bin$ cd
rahul@ubuntu:~$ mkdir testing
mkdir command not allow for you
rahul@ubuntu:~$ /bin/mkdir testing
mkdir command not allow for you

ดังนั้นคำถามของฉันคืออะไรควรเป็นวิธีการบรรลุนี้ มีเครื่องมือสำหรับสิ่งนี้หรือไม่?

อัปเดต 1 # แต่ถ้าผู้ใช้ฉลาดเขาสามารถคัดลอกไบนารี mkdir และเปลี่ยนชื่อและใช้งานได้ ดังนั้นวิธีการบรรลุเป้าหมายนี้


7
ตัวอย่างของคุณจะล้มเหลวเนื่องจากผู้ใช้สามารถคอมไพล์ของเขาเองmkdirและเปลี่ยนชื่อหรือแม้แต่เพียงคัดลอกและเปลี่ยนชื่อไบนารีที่มีอยู่ นอกจากนี้ยังมีตัวเชลล์สำหรับการแทนที่นามแฝงและฟังก์ชั่น
strugee

อืมถูกต้องแล้วมีอะไรอีกไหม?
ราหุลปาติล

ผู้ใช้ยังไม่จำเป็นต้องรวบรวมเขาสามารถคัดลอกได้อย่างง่ายดายcp /bin/mkdir mkdir2จากนั้นใช้ :(
Rahul Patil

การสร้างไดเรกทอรีนั้นเป็นงานทั่วไป / พื้นฐานที่มีหลายวิธีในการทำมันและแทบจะเป็นไปไม่ได้เลยที่จะบล็อกมันทั้งหมด (ยกเว้นโดยไม่ให้ผู้ใช้สร้างไฟล์เช่นป้องกันการเขียนไดเรกทอรีทั้งหมดกับเขา) ตัวอย่างเช่นcp -r /usr/local/lib gggจะสร้างไดเรกทอรีที่เรียกว่าggg(มีสำเนาของเนื้อหา/usr/local/libถ้ามีซึ่งผู้ใช้สามารถลบได้) คุณสามารถใช้find / -type d -emptyเพื่อค้นหาไดเรกทอรีว่างเปล่าเพื่อคัดลอก
G-Man พูดว่า 'Reinstate Monica'

คำตอบ:


21

ผมไม่ทราบว่าจะทำกับทุบตี แต่ฉันรู้ว่าของเปลือกที่ จำกัด สภาพแวดล้อมของผู้อื่น: lshell (เปลือก จำกัด )

ภาพรวมของการกำหนดค่าอย่างรวดเร็ว

Lshell ถูกกำหนดค่าผ่านทางไฟล์ INI โดยค่าเริ่มต้นจะเก็บรายการที่อนุญาตของคำสั่งที่อนุญาต แต่สามารถกำหนดค่าได้อย่างง่ายดายเพื่อห้ามผู้ใช้จากการใช้คำสั่งเฉพาะ

การกำหนดค่านี้ (ค่าเริ่มต้น conf /etc/lshell.conf) ห้ามมิให้ผู้fooใช้ใช้งานmkdir:

[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']

ในการกำหนดค่าบัญชีผู้ใช้ให้ใช้ lshell โดยค่าเริ่มต้นคุณต้อง:

 chsh -s /usr/bin/lshell foo

Lshell สามารถทำอะไรได้มากกว่าเช่น:

  • ความละเอียดระดับ 3 ระดับ: ผู้ใช้กลุ่มทั้งหมด
  • สามารถ จำกัด การเข้าถึงเส้นทางบางอย่างในระบบ
  • สามารถ จำกัด การใช้อักขระบางตัว (เช่น|)
  • สามารถ จำกัด การใช้คำสั่งบางอย่างผ่าน SSH เท่านั้น

และอื่น ๆ.

อัปเดต 1 #เพิ่มผลการทดสอบ:

rahul:~$ which bash
/bin/bash
rahul:~$ dd if=$(which bash) of=my_bash
*** forbidden syntax: dd if=$(which bash) of=my_bash
rahul:~$ bash
*** forbidden command: bash
rahul:~$ cp /bin/bash my_bash
*** forbidden path: /bin/bash
rahul:~$ /bin/bash
*** forbidden command: /bin/bash
rahul:~$ sh
*** forbidden command: sh
rahul:~$ dash
*** forbidden command: dash
rahul:~$ env bash
*** forbidden command: env
rahul:~$ cp /bin/mkdir mycreatedir
*** forbidden path: /bin/mkdir

3
ด้วยallowed = 'all' - ['mkdir']คุณไม่สามารถดำเนินการbashและไม่ถูก จำกัด อีกครั้งได้หรือไม่
dawud

3
ก็แค่คนอวดความรู้ขอโทษ แต่ยังคงมีหลายวิธีที่จะหลีกเลี่ยงข้อ จำกัด dd if=$(which bash) of=my_bash && chmod u+x my_bash && ./my_bashที่กำหนดโดยรายการที่เช่น ฉันคิดว่าปัญหาคือการขาดนโยบายเริ่มต้นที่ จำกัด เช่นในสถานการณ์นี้คุณให้สิทธิ์ตามค่าเริ่มต้นจากนั้นกำหนดสิทธิ์ DENY ตามรายการเมื่อมันควรเป็นวิธีอื่น: DENY โดยค่าเริ่มต้นแล้วตามนโยบาย GRANT .
dawud

1
@dawud: ฉันเห็นด้วยว่าการคงรายการที่อนุญาตของคำสั่งที่อนุญาตเป็นวิธีที่ดีกว่าการมีบัญชีดำและหวังว่าผู้ใช้จะไม่หลีกเลี่ยงมันด้วยการฉลาดกว่าผู้ดูแลระบบ
rahmu

2
@Marco ตรวจสอบตัวอย่างที่ให้ไว้ในคำตอบของฉัน ผมให้รายการที่อนุญาตของคำสั่งที่ได้รับอนุญาตและในสถานการณ์ที่ผู้ใช้สามารถไม่เพียงcpไบนารีไป / เส้นทางของเขาและเธอ ( rootเจ้าของไดเรกทอรีrxสำหรับผู้ใช้) และป้องกันจากการดำเนินการrbash ./executablesมันตอบคำถามของคุณหรือไม่
dawud

2
@dawud มันทำแน่นอน ฉันพลาดไดเรกทอรีถังอ่านอย่างเดียว
Marco

15

วิธีที่ฉันมักจะใช้ข้อ จำกัด แบบนี้ต้องมีเงื่อนไขหลายประการมิฉะนั้นข้อ จำกัด สามารถหลีกเลี่ยงได้อย่างง่ายดาย:

  • ผู้ใช้ไม่ได้อยู่ในwheelกลุ่มเดียวที่ได้รับอนุญาตให้ใช้งานsu(บังคับใช้ผ่าน PAM)
  • ผู้ใช้จะได้รับการรักษาความปลอดภัยอย่างถูกต้องrbashด้วยการชี้เส้นทางอ่านอย่างเดียวกับภาคเอกชน~/binนี้~/bin/ไดเรกทอรีมีลิงค์ไปยังสาธารณูปโภคง่ายๆ

    $ ll ~/bin
    total 0
    lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear*
    lrwxrwxrwx. 1 root dawud  7 Sep 17 08:58 df -> /bin/df*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep*
    lrwxrwxrwx. 1 root dawud  8 Sep 17 08:58 env -> /bin/env*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep*
    lrwxrwxrwx. 1 root dawud  9 Sep 17 08:58 grep -> /bin/grep*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 rvim -> /usr/bin/rvim*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo*
    lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail*
    lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc*
    
  • ผู้ใช้จะได้รับการ จำกัด สภาพแวดล้อมการอ่านอย่างเดียว (คิดว่าสิ่งที่ชอบLESSSECURE, TMOUT, HISTFILEตัวแปร)

  • ผู้ใช้จะถูกจับคู่ให้กับผู้ใช้ SELinux staff_uและได้รับสิทธิในการรันคำสั่งในฐานะผู้ใช้อื่น ๆ sudoที่จำเป็นต้องผ่าน
  • ผู้ใช้เป็น/home, /tmpและอาจ/var/tmpจะ polyinstantiated ผ่าน/etc/security/namespace.conf:

    /tmp       /tmp/.inst/tmp.inst-$USER-     tmpdir:create   root
    /var/tmp   /tmp/.inst/var-tmp.inst-$USER- tmpdir:create   root
    $HOME      $HOME/$USER.inst/              tmpdir:create   root
    

    นอกจากนี้ยังทำให้ไฟล์โครงกระดูกทั้งหมดอ่านได้อย่างเดียวสำหรับผู้ใช้และเป็นเจ้าของโดย/etc/security/namespace.initroot

วิธีนี้คุณสามารถเลือกได้ว่าจะ$USERสามารถดำเนินการmkdirในนามของตนเอง (ผ่านลิงก์ใน~/binไดเรกทอรีส่วนตัวจัดเตรียมผ่าน/etc/skelตามที่อธิบายไว้ข้างต้น) ในนามของผู้ใช้รายอื่น (ผ่านsudo) หรือไม่มีเลย


4

chown root:somegroup /bin/mkdirเพิ่มกลุ่มหุ่นเพิ่มผู้ใช้ไปยังกลุ่มที่ chmod g-x /bin/mkdir, โปรดทราบว่าสิ่งนี้ขึ้นอยู่กับผู้ใช้ที่ไม่สามารถแก้ไขกลุ่มได้ IIRC สิ่งนี้เป็นจริงใน GNU / Linux แต่ไม่ใช่ใน Unices อื่น ๆ


2
ในระบบไฟล์ส่วนใหญ่คุณยังสามารถใช้ ACLs เพิ่มเติมสำหรับการควบคุมที่ละเอียดยิ่งขึ้น - จำนวนกลุ่มที่ต้องการจะเพิ่มขึ้นอย่างทวีคูณกับจำนวนผู้ใช้ (เนื่องจากชุดค่าผสมที่เป็นไปได้) ไม่ต้องพูดถึงปัญหาการตั้งชื่อ
เตอร์

2
เพิ่มอีกหนึ่งจุดลบการอนุญาตการอ่านจากผู้ใช้รายอื่น 710 ดังนั้นผู้ใช้จึงไม่สามารถคัดลอกและเปลี่ยนชื่อไบนารีนั้นใช่ไหม
ราหุลปาติล

1
@RahulPatil ใช่และแน่นอนคุณต้อง จำกัด การใช้คอมไพเลอร์ด้วย
เตอร์

1

วิธีที่ดีที่สุดที่ฉันทดสอบคือการใช้ Profile.d วิธีที่ดีที่สุดและปลอดภัยที่สุด

ขั้นตอนที่ 1 (สร้างไฟล์นามแฝง)

[root@newrbe ~]# vim /etc/customalias.sh

เพิ่มบรรทัดด้านล่าง:

alias rm="echo remove contenet is restricted"
alias poweroff="echo Poweroff is restricted"
alias chmod="echo Change Permission is restristed"

บันทึกและออก

ขั้นตอนที่ 2 (สร้างตัวโหลดโปรไฟล์)

/etc/profile.d/ ตำแหน่งนี้มีไฟล์สำหรับการทุบตีเสร็จสมบูรณ์

[root@newrbe ~]# vim /etc/profile.d/customsource.sh

เพิ่มบรรทัดด้านล่างใต้ไฟล์บรรทัดเหล่านี้จะบล็อกคำสั่งที่กล่าวถึงสำหรับผู้ใช้ด้านล่าง

if [ `whoami` == "user1" ] && [ `whoami` == "user2" ]; then
    source /etc/customalias.sh
fi

บันทึกและออก

ตอนนี้ออกและ relogin

ขอแสดงความนับถือ -Mansur


/etc/profile.d/ไม่ได้สำหรับbashการเสร็จสิ้นก็ที่ไปยังสถานที่เข้าสู่ระบบการปรับแต่งเซสชั่นสำหรับผู้ใช้ที่ใช้ POSIX เหมือนเปลือกหอยเข้าสู่ระบบดังนั้นจึงมักจะไม่ได้อยู่ที่bashชื่อแทนการปรับแต่ง (ซึ่งค่อนข้างจะไปใน/etc/bash.bashrc) จะไปและมันควรจะมีไวยากรณ์ POSIX เชลล์ (ดังนั้นโดยทั่วไป.แทน จากsourceและ=แทน==)
Stéphane Chazelas

-1

ติดตั้ง sudoers แล้วลองกำหนดค่าที่นั่นซึ่งมีผู้ใช้และคำสั่งอะไร


4
ยินดีต้อนรับสู่ SX โปรดเพิ่มรายละเอียดในคำตอบของคุณ; สหกรณ์, sudoหรือใครก็ตามที่อ่านคำถามนี้ในอนาคตอาจจะไม่ได้ตระหนักถึง
โจเซฟอาร์

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