특정 사용자를위한 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

그래서 내 질문은 이것을 달성하는 방법은 무엇입니까? 이것에 대한 도구가 있습니까?

Update 1 # 그러나 사용자가 똑똑하다면 mkdir 바이너리를 복사하고 이름을 바꾸어 사용할 수 있습니다. 그래서 이것을 달성하는 방법?


7
사용자가 자신을 컴파일 mkdir하고 이름을 바꾸거나 기존 바이너리를 복사하고 이름을 바꿀 수 있기 때문에 예제가 실패합니다 . 또한 별칭과 함수를 재정의하기위한 셸이 내장되어 있습니다.
strugee

흠 맞아, 어쨌든 있습니까?
Rahul Patil

또한 사용자는 쉽게 복사 cp /bin/mkdir mkdir2하고 사용할 수 있도록 컴파일 할 필요가 없습니다. (
Rahul Patil

디렉토리를 만드는 것은 여러 가지 방법으로 수행하는 일반적인 / 기본 작업이며, 사용자가 파일을 만들지 못하게하는 것 (즉, 모든 디렉토리에 대한 쓰기 방지)을 제외하고는 모든 것을 차단하는 것이 거의 불가능합니다. 예를 들어, ( 있는 경우 사용자가 삭제할 수있는의 컨텐츠 사본이 포함 cp -r /usr/local/lib ggg된) 디렉토리를 작성합니다 . 복사 할 빈 디렉토리를 찾는 데 사용할 수 있습니다 . ggg/usr/local/libfind / -type d -empty
G-Man, 'Reinstate

답변:


21

bash로 수행하는 방법을 모르지만 사용자 환경을 제한하는 또 다른 쉘 인 lshell (limited shell)을 알고 있습니다.

구성에 대한 간단한 개요

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은 다음과 같이 더 많은 작업을 수행 할 수 있습니다.

  • 세 가지 수준의 세분성 : 사용자, 그룹, 모두
  • 시스템의 특정 경로에 대한 액세스를 제한 할 수 있습니다.
  • 와 같은 특정 문자의 사용을 제한 할 수 있습니다 |.
  • 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. 문제는 제한적인 기본 정책이 없다는 것입니다. 즉,이 시나리오에서는 기본적으로 권한을 부여하고 목록을 기반으로 권한을 거부합니다. .
dawud

1
@ dawud : 허용 된 명령의 허용 목록을 유지하는 것이 차단 목록을 갖는 것보다 더 나은 접근 방법이며 사용자가 관리자를 잘 모르는 것으로 우회하지 않기를 바랍니다.
rahmu

2
@ Marco, 내 대답에 제공된 예를 확인하십시오. 나는 허용 명령 허용 된 사이트 목록을 제공하고, 그 시나리오에서, 사용자 수뿐만 아니라 cp그 / 그녀 (PATH에 진 root소유 디렉토리, rx사용자에 대한) 및 rbash실행의 방지 ./executables. 귀하의 질문에 대답합니까?
dawud

2
@dawud 정말 그렇습니다. 읽기 전용 bin 디렉토리가 누락되었습니다.
Marco

15

일반적으로 이러한 종류의 제한을 구현하려면 몇 가지 조건을 충족해야합니다. 그렇지 않으면 제한을 쉽게 피할 수 있습니다.

  • 사용자는 wheel그룹 에 속하지 않으며 사용 권한이있는 유일한 그룹입니다 su(PAM을 통해 시행).
  • 사용자가 제대로 확보 주어진 rbash개인에 읽기 전용 PATH을 가리키는를 ~/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.init모든 스켈 레탈 파일을 사용자가 읽기 전용으로 소유하고 root있습니다.

이 방법 으로 다른 사용자를 대신하여 (위에 설명 된대로 개인 디렉토리 의 링크를 통해 ,을 통해 프로비저닝 된) 개인을 대신하여 $USER실행할 수 있는지 또는 전혀 사용하지 않을 수 있습니다 .mkdir~/bin/etc/skelsudo


4

더미 그룹을 추가하는 그룹에 사용자를 추가 chown root:somegroup /bin/mkdir, chmod g-x /bin/mkdir. 이는 그룹을 수정할 수없는 사용자에 의존합니다. IIRC 이것은 GNU / Linux에서는 사실이지만 다른 Unices에서는 그렇지 않습니다.


2
대부분의 파일 시스템에서는 세밀한 제어를 위해 확장 ACL을 사용할 수도 있습니다. 이름 지정 문제는 말할 것도없고 필요한 조합 수로 인해 필요한 그룹 수가 기하 급수적으로 늘어납니다.
peterph

2
하나 이상의 포인트를 추가하고 다른 사용자의 읽기 권한을 제거하십시오 (710). 사용자가 해당 바이너리가 아닌 다른 바이너리를 복사하고 이름을 바꿀 수 없습니까?
Rahul Patil

1
@RahulPatil 예, 물론 컴파일러 사용을 제한해야합니다.
peterph

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/이 위치에는 bash 완료를위한 파일이 있습니다.

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

파일 아래에 아래 줄을 추가하십시오.

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

저장하고 종료

이제 종료하고 다시 로그인

감사합니다 -Mansur


/etc/profile.d/위한 것이 아닙니다 bash완료 그렇지 않은 경우 일반적으로, 그래서 그것은 로그인 쉘 POSIX-처럼 사용하는 사용자를위한 장소 로그인 세션 사용자 정의한 내용에 어디 bash별칭 사용자 정의한 내용은 (대신에 갈 것이다 /etc/bash.bashrc그래서 일반적으로 () 갈 것과는 POSIX 쉘 구문을해야한다, .대신 의 source=대신 ==).
Stéphane Chazelas

-1

sudoers를 설치하고 그 사용자와 what 명령을 구성하십시오.


4
SX에 오신 것을 환영합니다. 답변에 세부 사항을 추가하십시오. OP 또는 향후이 질문을 읽는 사람은 누구나 알지 못할 수도 있습니다 sudo.
Joseph R.

이 답변은 명백히 잘못되었습니다
kiltek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.