실행 프로세스 추적 방식을 통한 명령어 우회 원천 차단
November 22, 2024
리눅스 프로세스 실행 제어 및 보안 강화 솔루션
리눅스 시스템에서는 사용자가 실행 권한을 가진 프로그램을 SSH 세션에서 자유롭게 실행할 수 있습니다. 하지만 시스템 보안과 안정성을 위해 특정 프로그램의 실행을 제한해야 하는 경우가 있습니다. 시스템에서는 기본적으로 root 사용자와 일반 사용자를 구분해 실행 권한을 구분하는 매커니즘을 제공하지만, 이 정도의 제어로는 충분하지 않은 경우가 있습니다. 이러한 제어를 위해서는 프로세스의 생성과 실행을 실시간으로 모니터링하고 차단할 수 있는 기술적 기반이 필요합니다.
본 백서에서는 Linux 커널 레벨의 저수준에서 프로세스를 모니터링하고 제어하는 솔루션을 소개합니다. 우리의 솔루션은 다음과 같은 핵심 기능을 구현했습니다:
- 실시간 child 프로세스 모니터링
- 실행 금지된 프로그램 감지
- 제한된 프로그램 실행 시도 즉각 차단
이러한 기능들은 향후 사용자별 권한 제어, 상세 감사 로깅, 정책 관리 등 고도화된 보안 솔루션을 구현하기 위한 기술적 토대가 됩니다.
문제
많은 조직, 특히 금융, 의료, 공공기관에서는 시스템에 대한 모든 접근과 작업을 기록해야 하는 규제 요구사항이 있습니다. ISMS-P, ISO/IEC 27001, PCI DSS, SOC와 같은 보안 인증들은 누가, 언제, 어떤 작업을 수행했는지 추적할 수 있기를 요구합니다.
이러한 작업 기록은 사고 예방과 조사에도 핵심적인 역할을 합니다. 관리자의 실수로 인한 시스템 장애나 악의적인 내부자의 데이터 유출 시도를 사전에 차단할 수 있습니다. 문제가 발생했을 때도 작업 이력을 통해 신속하게 원인을 파악하고, 필요한 경우 이전 상태로 복구할 수 있습니다.
시스템 관리자들의 작업 내역을 기록하고 제어함으로써 책임성을 강화할 수도 있습니다. 승인되지 않은 작업이나 민감한 정보에 대한 접근을 효과적으로 통제할 수 있으며, 이는 결과적으로 시스템 운영의 안정성과 효율성 향상으로 이어집니다.
이러한 요구사항들은 Linux의 기본적인 사용자 권한 체계나 시스템 로그만으로는 완벽하게 충족하기 어렵습니다. 그래서 사용자의 작업을 모니터링하고 통제할 수 있는 추가적인 보안 체계가 필요합니다.
아이디어
우리는 SAC 솔루션에서 시스템 사용자가 실행하는 명령어에 대한 감사와 통제 기능을 제공합니다. 특히 명령어 통제 기능은 시스템 레벨의 저수준 접근 방식을 사용해, 실행 파일이 로드되기 직전에 사전에 정의된 보안 정책을 기반으로 검증을 수행하도록 구현되었습니다. 이런 방식은 구현이 단순하면서도 쉘 스크립트 안에 명령어를 숨긴다던가, alias를 이용한다던가 등의 여러가지 경우의 수를 따질 필요가 없어 효과적입니다.
이러한 구조의 장점은 다음과 같습니다.
- 시스템 콜 후킹 기술을 활용하여 명령어 실행 시점에 개입함으로써, 우회 시도를 원천적으로 차단합니다. 사용자가 어떤 방식으로 명령어를 실행하려 하더라도, 우리 솔루션의 검증을 피할 수 없습니다.
- 어플리케이션 레벨이 아닌 시스템 레벨에서 동작하므로 특정 환경이나 쉘에 종속적이지 않습니다.
- 다양한 경우의 수를 고려할 필요가 없기 때문에 코드가 단순하고 안정적입니다.
우리는 이러한 방법으로 경쟁사에 비해 훨씬 견고하고 잘 동작하는 차단 솔루션을 구현할 수 있었습니다. 다음절에서 차단 프로그램이 어떻게 동작하는지 보여드릴 것입니다.
데모
/usr/bin/df 의 실행을 차단하도록 설정해서 테스트를 진행했습니다.
심볼릭 링크 차단
logan@ip-xxx-xxx-xxx-xxx:~$ ls -l hello
lrwxrwxrwx 1 logan logan 11 Nov 6 11:35 hello -> /usr/bin/df
logan@ip-xxx-xxx-xxx-xxx:~$ ./hello
[963713:./hello] ./hello blocked!
Killed
앨리어스 차단
logan@ip-xxx-xxx-xxx-xxx:~$ alias hi=df
logan@ip-xxx-xxx-xxx-xxx:~$ hi
[963927:/usr/bin/df] /usr/bin/df blocked!
Killed
스크립트를 통한 실행 차단
- test1.sh는 df를 실행합니다.
- test2.sh는 test1.sh를 호출하고, test1.sh가 df를 호출합니다.
$ cat test1.sh
#!/bin/bash
df
$ ./test1.sh
[964362:/usr/bin/df] /usr/bin/df blocked!
./test1.sh: line 3: 964362 Killed df
$ cat test2.sh
#!/bin/bash
./test1.sh
$ ./test2.sh
[964480:/usr/bin/df] /usr/bin/df blocked!
./test1.sh: line 3: 964480 Killed df
실행파일을 숨기려는 시도 차단
df 라는 실행파일 이름이 드러나지 않게 하기 위해 장난스런 스크립트를 만들었습니다. 이 스크립트는 파라미터들의 첫글자를 조합해 명령어를 만들어 실행합니다. “delta foxtrot”의 첫글자를 모으면 “df”가 됩니다.
$ cat test3.sh
#!/bin/bash
# make command with first characters of arguments
command=""
for arg in "$@"; do
command+="${arg:0:1}"
done
# execute command
$command
$ ./test3.sh delta foxtrot
[964891:/usr/bin/df] /usr/bin/df blocked!
./test3.sh: line 10: 964891 Killed
$command
위에서 언급한 여러가지 상황을 테스트한 데모 영상입니다.
여러가지 데모를 보여드렸지만 사실 어떤 경로로 실행하고 있는지는 중요하지 않습니다. 프로세스가 실행되는 순간을 직접 차단하기 때문에 거의 확실하게 허가 받지 않은 프로그램 실행을 차단할 수 있다고 보면 됩니다.
실시간 명령어 차단을 통한 선제적 보안 강화 솔루션
기존의 로그 기반 모니터링이 사후 분석에 중점을 두었다면, 이 솔루션은 위험한 명령어의 실행을 실시간으로 차단합니다. 시스템 관리자는 더 이상 악의적이거나 실수로 인한 위험한 명령어 실행을 걱정할 필요가 없습니다. 위험 요소가 실제 피해를 발생시키기 전에 차단되기 때문입니다.
본 문서에서는 시스템 콜을 감시하여 특정 실행 파일의 실행을 차단하는 방법을 설명했지만, 이 기술은 더 넓은 범위의 보안 통제를 가능하게 합니다. 예를 들어, /usr/bin/rm 명령어를 차단하는 대신 unlink() 시스템 콜 자체를 차단하면 파일 삭제 시도를 더 근본적인 수준에서 통제할 수 있습니다.
이러한 시스템 콜 수준의 제어 기능에 상세한 감사 로그를 추가하면, 강력한 보안 솔루션으로 발전시킬 수 있습니다. 차단된 명령어나 시스템 콜에 대한 정보뿐만 아니라, 실행을 시도한 사용자, 시도 시각, 실행 환경 등을 기록하여 보안 감사와 사고 분석에 활용할 수 있습니다.
더 나아가 이 기술은 다음과 같은 추가 기능으로 확장할 수 있습니다:
- 사용자나 그룹별로 다른 보안 정책 적용
- 특정 시간대나 상황에 따른 유연한 제어 규칙 설정
- 보안 관제 시스템과의 연동을 통한 실시간 알림
- 머신 러닝을 활용한 이상 행위 탐지
이러한 확장 기능들은 조직의 보안 요구사항이 높아짐에 따라 단계적으로 구현할 수 있습니다. 쿼리파이는 고객의 니즈에 맞는 새로운 보안 기능을 지속적으로 발굴하고 개발하여 더욱 안전한 시스템 환경을 만들어가는 파트너가 되겠습니다. 도움을 원하거나 같이 해보고 싶은 제안이 있다면 언제든 연락주세요.