리눅스 설치시 기본적으로 제공되는 쉘 bash
에서는 특정 사용자의 명령어를 제한하기 위한 기능이 존재하지 않는다.
/bin/
에 설치된 바이너리의 경우 퍼미션을 지정을 통해 사용자 접근 제한이 가능하나, 세부적으로 사용자별 접근 제한이 가능하지 않다.
이를 해결하기 위해선 bash
에서 restricted shell
기능을 지원하며, 이를 rbash
라 한다.
본 문서에서는 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
자체에서 /경로/바이너리
방식으로 프로그램에 접근하는 것을 막는 것이기 때문에, 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 |