모든 명령이 별명으로 정의되지 않도록 방지


10

모든 명령이 별명으로 정의되지 않도록하는 방법이 있습니까?

예를 들어, 사용자는 rm별칭 이름으로 다른 명령 (Ubuntu 기본 명령) 을 정의 할 수 없어야합니다 .


정확하게 무슨 뜻입니까? 실수로 그렇게하지 못하도록 "소프트 블록"과 같은 것을 찾고 있습니까?
kos

4
가능하더라도 그렇게하는 것이 무엇인지 잘 모르겠습니다.
muru

4
이것에 대한 논리는 무엇입니까? 사용자가 실제 명령을 입력하는 것을 막지 않습니다 ... 그래서 누군가가 별칭을 차단해야 할 이유가 없습니까?
린츠 윈드

2
muru와 Rinzwind가 말했듯이 요점이 무엇입니까? 별칭은 사용자가 이미 허용 한 것보다 초기 작업을 수행 할 수 없으므로 별칭을 차단하면 사용자의 삶이 더 어려워집니다. 또한 솔루션이 무엇이든간에 (예 : 별칭을 사용하여 내장 기능을 재정의 함) 잠금을 해제하지 않으면 사용자가 우회 할 수없는 방법을 생각할 수 없습니다 ~/.bashrc.
kos

모든 별칭을 차단하지 않고 기본 명령 이름을 별칭 이름으로 사용하지 않도록합니다. 동일한 별칭 명령과 함께 \를 사용하여 실제 명령을 실행하는 등 여러 가지 방법으로 별칭을 이스케이프 처리 할 수 ​​있다는 것을 알고 있습니다. 그게 다야
αғsнιη

답변:


24

사용자가 선호하는 별칭을 정의하지 못하게 할 방법이 없습니다. 치다:

  1. 에서 별칭을 사용 중지합니다 /etc/bash.bashrc. 원하는 곳 어디에서나 가능합니다.
  2. 당신은 모든 별칭의 언급 삭제 /etc/bash.bashrc, 모든 ~/.bashrc~/.bash_aliases스크립트를 통해. 별명을 다른 파일에 넣고 소싱합니다.
  3. PROMPT_COMMAND특정 별칭을 비활성화 하는 명령을 실행 합니다. 그들은 재정의하거나 정의를 해제 PROMPT_COMMAND합니다.
  4. DEBUG별명을 트랩 및 정의 해제합니다. 그들은 함정을 제거합니다.
  5. 당신은 루트에 대한 호출에서 소스 된 모든 파일을 chown. 이들은 다른 파일을 사용하여 처음 실행하는 명령으로 수동으로 소싱합니다.
  6. 당신은 내장 명령을 해제 unset, builtinenable; 기능을 만드십시오alias ; declare -rf alias사용자가 기능을 수정하지 못하게하기 위해; 함수를 내 보냅니다. 그들은 실행 /bin/bash으로 --rcfile하고--init-file 내장 명령은 이제 것을 가능하게 새로운 쉘을 시작합니다.
  7. ...

컴파일 타임에 별칭을 비활성화 할 수 있습니다. bash를 최신 상태로 유지하고 다음 Shellshock의 영향을받지 않는 것은 사용자의 몫입니다. 물론 사용자는 자신의 배쉬를 만들 수 있습니다.


4
나는 약간 재미있는 아이디어를 가지고 있었다 : 당신은 alias alias : =)
Rinzwind

4
그리고 그들은 unalias alias.
muru

4
@muru는 물론 unalias도 별명을 지정할 수 있습니다 : +
Rinzwind

8
@Rinzwind 그리고 그들은 실행 \unalias unalias됩니다.
muru

10

TL; DR

사용자가 별칭을 만들지 못하게하는 유일한 방법은 별칭을 지원하지 않는 쉘을 제공하는 것입니다. 이것은 일반적으로 X / Y 문제입니다. 여기서 X는 실제로 사용자에게 공유 시스템의 쉘이 제공된 후 사후 에 문제를 해결하기보다는 적절한 제어 또는 아키텍처로 해결해야하는 위협 모델입니다 .

아래에서는 기술적으로 올바른 답변과 이로 인해 해결되지 않을 문제에 대한 지침을 제공합니다. 또한 대체 제어에 대한 추가 지침을 제공합니다.

Bash Restricted Shell 사용

rbash를 사용자의 로그인 쉘로 지정 하여 Bash의 제한된 쉘 을 사용할 수 있습니다 . 예를 들면 다음과 같습니다.

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 jail에 넣거나 다른 쉘에 대한 액세스를 포함하지 않는 수정 된 PATH 를 제공하지 않는 한, 사용자 bash가 프롬프트 에서 간단히 입력 하고 무제한 쉘을 얻는 것을 막을 수있는 것은 없습니다 .

또한 설계 상 제한된 쉘은 디렉토리 변경과 같은 많은 일반적인 활동을 방지합니다.

$ cd /tmp
rbash: cd: restricted

그러나 PATH의 다른 스크립트 나 프로그램이 그렇게하는 것을 막지는 않습니다 . 이는 사용자 환경을 신중하게 조작해야하며, 특히 rbash가 PATH를 읽기 전용으로 설정하더라도 초기화 후에 수행 하기 때문에 시작 파일에서 PATH 를 수정하지 못하도록해야합니다 .

더 나은 선택

rbash를 사용하더라도 광범위한 제어 세트의 일부로 수행해야합니다. 몇 가지 예는 다음과 같습니다.

  • 의 방지가 아닌 기술적 인 사용자가 실수로 같은 기본 별칭을 제공하여 호출 위험한 명령 rm -i, mv -icp -i/etc/bash.bashrc의 파일.

    • 원래 예를 들어, 아마도 가장 합리적인 솔루션 일 것입니다.
    • 원하는 enable -n alias경우 이것을 결합 할 수 있습니다 .
    • 이것은 알 수없는 사용자가 별칭을 변경하는 것을 방지하지는 않지만, 기술이 아닌 사용자가 관심있는 작업을 수행하지 못하게하는 것으로 충분할 수 있습니다.
  • 파일 및 디렉토리를 보호하기위한 기존 Unix 권한 또는 POSIX ACL

  • 단일 비 대화식 명령을 수행하는 로그인. 예를 들면 다음과 같습니다.

    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 jail을 사용하십시오 .

  • Xen, OpenVZ, LXC, VMware, VirtualBox 또는 기타 기술과 같은 가상화를 사용하여 분리 된 환경을 제공하십시오.

위협 모델을 정확하게 정의하면 사용 사례에 가장 적합한 제어를 식별 할 수 있습니다. 앨리어싱을 방지하려는 이유 (예 : 실제 문제가 해결 되는 이유)에 대한 이해가 없으면 가장 적절한 컨트롤을 선택할 수 없습니다.


일반적으로 +1이지만이를 X / Y 문제로 분류하기위한 것입니다.
Joe

5

muru의 답변에서 알 수 있듯이 이것은 무의미한 노력입니다. 그러나 몇 가지 옵션이 있지만 완벽하지는 않습니다.

bash매뉴얼 에 따르면 함수는 항상 별칭보다 우선하므로 다음을 수행 할 수 있습니다.

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

함수 정의를 시스템 전체에 배치 할 수 .bashrc있지만, muru이 지적한 것처럼 똑똑한 사용자는 bashrc예를 들어 다른 파일을 소싱하여 별칭을 얻는 방법을 찾을 수 있습니다.

내가 연주 한 또 다른 아이디어는 enable내장되어 있습니다. alias내장 쉘이며 내장 기능을 활성화 또는 비활성화 할 수있는 bash멋진 enable명령이 있습니다. 예를 들어, 여기 내가 비활성화되어 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를 사용하는 것이 옵션입니다.


모든 별칭을 차단하지 않고 내장 명령 만 별칭 자체가 아님 :)
αғsнιη

@ Afshin.Hamedi 글쎄, 기본 명령은 무엇입니까? 우분투와 함께 제공되는 것? 즉, 기본 설치와 함께 제공된 모든 명령 (이진 파일) 목록이 있어야합니다. 그런 다음 사용자가 셸을로드하거나에 별칭을 지정하려고 할 때마다 rm목록을 확인합니다. 목록이 꽤 클 것으로 생각하면 시작하는 데 시간이 오래 걸리고 사용자는 많은 불만을 제기하고 시스템 관리자로서 당신을 미워할 것입니다 :)
Sergiy Kolodyazhnyy

그것은 당신이 가지고있는 재미 있고 멋진 질문입니다. 나는 그것을 좋아합니다! 선택적 앨리어싱이 좋을 것입니다. 하지만 쉘 개발자 :) 그것을 구현하기위한 필요성을 발견하지 않는 한이 달성 의심
세르지 Kolodyazhnyy

기능 아이디어가 좋았습니다. 가장 가까이 왔습니다.
muru

0

당신은 (에 정의 /etc/profile라는 함수) alias검증 당신이 (아마 사용하여 원하는 작업을 수행 type -p(모든 "우분투의 기본 명령"후가 "에서 실행됩니다) $PATH내장을 호출하기 전에") alias다른 사람들이 지적 밖으로을 가지고, 사용자가 얻을 수있는,하지만 그 주위. 다른 사용자 집합을 얻거나 교육하지 않는 이유는 무엇입니까 ( " alias명령을 재정의 하는 것을 정의하는 것이 매우 중요 ls합니다. 예를 들어, 암호를 묻는 메시지가 표시되는 이유는 무엇 입니까?)?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.