리눅스 설치시 기본적으로 제공되는 쉘 bash 에서는 특정 사용자의 명령어를 제한하기 위한 기능이 존재하지 않는다.
/bin/ 에 설치된 바이너리의 경우 퍼미션을 지정을 통해 사용자 접근 제한이 가능하나, 세부적으로 사용자별 접근 제한이 가능하지 않다.
이를 해결하기 위해선 bash에서 restricted shell 기능을 지원하며, 이를 rbash라 한다.
The Restricted Shell (Bash Reference Manual)
6.10 The Restricted Shell If Bash is started with the name rbash, or the --restricted or -r option is supplied at invocation, the shell becomes restricted. A restricted shell is used to set up an environment more controlled than the standard shell. A restr
www.gnu.org
본 문서에서는 rbash를 이용하여 사용자가 사용가능한 명령어를 제한하기 위한 방법을 설명한다.
1. Restricted Shell 생성
rbash를 생성하는 법은 아래와 같은 간단한 명령어로 가능하다.
cp /bin/bash /bin/rbash
기본적으로 bash 자체가 restricted mode를 지원하며, 바이너리 명을 rbash로 두는것 만으로도 손쉽게 적용 가능하다.
rbash에서 제한된 기능은 아래와 같다.
- cd 명령(디렉토리 변경)
- PATH(설정/해제)
- ENV 일명 BASH_ENV(환경 설정/설정 해제)
- 기능 가져오기
- 인수 '/'를 포함하는 파일 이름 지정
- 인수 '-'를 포함하는 파일 이름 지정
- '>', '>>', '>|', '<> 을 사용하여 출력 리디렉션 ', '>&', '&>'
- 'set +r' 또는 'set +o'를 사용하여 제한 해제
2. 유저 생성 및 rbash 적용
2.1. 신규유저
신규 유저를 생성할 때, 기본적으로 적용될 shell을 -s 옵션을 주어 rbash로 설정한다.
useradd -s /bin/rbash ${USER}
2.2. 기존 유저
기존 유저의 shell을 usermod 명령어의 -s 옵션을 이용하여 변경한다.
usermod -s /bin/rbash ${USER}
3. 명령어 제한
리눅스에서는 기본적으로 명령어 입력 시 쉘에서 기본적으로 제공하는 기능을 제외한 나머지 기능들은
$PATH에 등록된 바이너리를 실행하는 방식으로 동작한다.
또한, 설치된 프로그램의 바이너리는 /bin/ /usr/bin 등의 경로에 등록되어 있다.
따라서, rbash를 사용할 때 $PATH 가 바이너리가 설치된 경로가 아닌, 별도의 공간을 가리키게 하여 사용자의 명령어를 제한 할 수 있다.
3.1. profile 설정
bash profile을 생성하여 해당 사용자가 실행가능한 바이너리 목록을 user home에 지정하고 $PATH에 등록한다.
또한, 해당 사용자가 임의로 $PATH를 수정할 수 없도록 설정한다.
cat <<EOF > /home/${USER}/.bash_profile
readonly PATH=$HOME/programs #PATH 변경 못하도록 readonly 처리
export PATH
EOF
.bashrc 파일의 내용을 제거한다.
cat <<EOF > /home/${USER}/.bashrc
EOF
사용자가 임의로 파일을 수정할 수 없도록 권한을 변경한다
chown root.root /home/${USER}/* -R
chmod 755 /home/${USER}/* -R
chattr -i /home/${USER}/.bashrc
chattr -i /home/${USER}/.bash_profile
위의 과정을 수행하면 $PATH의 수정을 제한하게 되며, rbash가 실행할 수 있는 프로그램의 목록은 /home/${user}/programs 에 등록된 바이너리로 한정된다.
3.2 프로그램 허용
사용 가능한 프로그램을 담을 디렉터리를 생성한다.
mkdir /home/${USER}/programs
해당 디렉터리에 사용 허용할 프로그램을 등록한다.
cp /bin/pwd /home/${user}/programs # 예시, pwd 사용 허가
4. 테스트
rbash가 실행된 상태에서 /bin 에 등록된 바이너리를 실행할 경우 아래와 같은 메시지가 발생한다.
[seong889@localhost ~]$ /bin/pwd
bash: /bin/pwd: restricted: cannot specify `/' in command names
또한, cd 명령어로 지정된 경로를 벗어나려 하더라도, 아래와 같은 메시지가 표출된다.
[seong889@localhost ~]$ cd /
bash: cd: restricted
5. 결론
rbash 사용할경우 쉽게 사용자의 접근 제어가 가능하다.
하지만, 여러 단점이 존재하는데, 아래 링크를 보면 다양한 escape 방법이 소개되어 있다.
rbash escape | rbash restricted shell escape
rbash escape | rbash restricted shell escape How to bypass rbash restricted shell. Today we are share many way to bypass rbash restricted shell
www.hacknos.com
기본적으로 rbash 자체에서 /경로/바이너리 방식으로 프로그램에 접근하는 것을 막는 것이기 때문에, shell과 관련이 있는 프로그램에 의해 rbash를 벗어 날 수 있게 된다.
또한, 파일에 대한 접근 자체를 차단할 수 없다
ls /
위와 같은 명령어를 입력해도 전체적인 파일의 목록이 노출되는데, 이는 sftp 로 접근했을 때도 파일 목록이 노출되게 되며심지어 파일 다운로드도 가능하다.
이를 막기 위해선 접근을 막을 경로에 대해 퍼미션 제한을 세심하게 걸어줄 필요가 존재한다.
chmod 550 / # 동작 테스트를 해보지는 못했다.
5.1. 대안
사용자 명령어 제한을 위해 각 서버의 디렉터리들을 모두 조사하고, 퍼미션을 설정하는것은 엄청난 노동이다. 또한, 실수로 설정하지 못한 경로가 존재할 경우 사용자가 마음대로 접근 가능 할 수 있다.
또 다른 문제로는 일부 서비스(ex. apache)의 경우 자체적인 권한을 갖고 동작 하기 때문에 문제가 발생할 수 있다.
root.root 권한으로 550(r-x r-x ---)으로 설정하게 될 경우, 일부 서비스가 구동에 필요한 디렉터리에 접근하지 못해 서비스가 동작하지 않는 문제가 발생할 수 있기 때문이다.
그래서, 이에 대한 대안으로 container 기능을 사용하여 sshd 및 사용자에 필요한 프로그램만 설치하고, 사용자가 접근해야 할 파일들에 한해 볼륨 마운트 하여 제공하는 방법을 사용했다.
이에대한 방법은 추후 작성할 예정이다.
'OS > Linux' 카테고리의 다른 글
| [CentOS] Gnome 설정화면을 X11 forwarding 에서 실행하기 (1) | 2020.06.02 |
|---|---|
| [CentOS 7] Gnome환경에서 ssh를 이용하여 Display 항상 켜기로 설정 (0) | 2020.06.02 |
| CentOS + QTCreator 환경에서 Distcc 빌드 설정하기 (0) | 2020.04.08 |
| [CentOS] 최신 버전의 Git으로 업데이트 하기 (0) | 2019.07.17 |
| [CentOS] SWAP 빈도 조절하여 성능 개선 (0) | 2019.06.24 |
| [CentOS 7] Multicast Packet을 Loopback으로 송/수신 (0) | 2019.06.21 |
| [CentOS] Gnome 환경에서, Titlebar 크기 조절하기 (0) | 2019.05.27 |
| umask를 이용해서 Default Permission 주기 (0) | 2014.08.29 |