Linux Opensource
이번에 다룰 내용은 조금 가볍게.. 최근에 페이스북에서 발표한 osquery 에 대한 내용을 다뤄볼까 합니다. 과연 osquery는 어떤 기능을 가지고 있으며 어떻게 활용할 수 있을지에 대해서 얘기해 보려고 합니다.
https://osquery.io/에 자세한 소개가 나와 있습니다. 한 마디로 정의하자면 OS의 다양한 자원들에 대해 리눅스 CLI 가 아닌 RDB에 질의하는 것처럼 쿼리를 날려서 정보를 가져올 수 있게 해 주는 툴입니다.
https://speakerdeck.com/marpaia/host-intrusion-detection-with-osquery 이 곳을 보면 osquery 의 설계 철학도 함께 느끼실 수 있는데요, OS 환경의 변화를 감지하여 보안성을 높인다는 것이 설계 철학인 것으로 느껴집니다.
다운로드 페이지에서 CentOS 6.6 버전을 다운로드해서 설치합니다.
네.. 뭐 설치 과정이라고 하기도 뭐 할 정도로 간단하게 설치가 됩니다. osqueryi 명령을 이용해서 한 번 들어가 보죠.
어떤 테이블들이 있는지 .table 명령으로 살펴보겠습니다.
네.. 스크린샷에서는 좀 잘렸지만 상당히 많은 테이블이 있습니다. 자세한 테이블 목록은 https://osquery.io/docs/tables/ 이곳에서 확인할 수 있습니다.
간단하게 몇 가지 쿼리를 날려 봅니다. OS에 어떤 패키지들이 설치되어 있는지 한 번 살펴볼까요? 너무 많으니 limit로 제한을 걸어야겠죠.
스크린샷이 너무 커서 살짝 잘랐습니다. 리눅스 CLI인 rpm -qa를 통해서 보는 것과 비슷한 정보를 알 수 있습니다. 오히려 size를 포함한 좀 더 자세한 정보를 알 수 있습니다.
처음 osquery를 설치해서 써 봤을 때는 참 신기하고 재미있긴 했습니다만, 과연 이 툴을 어디에 어떻게 활용할 수 있을까 라는 생각이 들었습니다. 서버에 접속해서 쿼리를 날려보는 것도 한두 번이지, 매일매일 들어가서 쿼리를 날려볼 수도, 그럴 필요도 없으니까요.
하지만 osqueryd를 이용하면 주기적으로 서버의 변경 상태를 체크해 볼 수 있습니다. 원하는 쿼리를 설정 파일에 등록해 두면 주기적으로 쿼리를 실행해서 그 결과를 저장하는 데몬입니다. 간단한 설정을 통해서 데몬을 실행시켜 보겠습니다.
맨 처음 실행하게 되면 아래와 같이 에러가 발생합니다. cp 명령을 통해 default 설정을 복사해서 수정해 줍니다.
그리고 실행하게 되면 아래와 같이 아무런 메시지가 없습니다. 뭔가 버그가 있는 듯한 느낌이 나지만.. (제가 설정을 잘못해서 그럴 수도 있습니다.)
그래서 /etc/osquery/osquery.conf 파일에서 debug, verbose_debug를 false에서 true로 바꾸고 재실행해 줍니다.
그럼 아래와 같이 로그가 생기는 것을 볼 수 있습니다.
쿼리도 조금 바꿔 보겠습니다. 좀 더 의미 있게 패키지 목록을 가져오는 쿼리로 수정해보겠습니다. 아래와 같이 수정한 후 재시작합니다. 그리고 약 1분 정도 지나면 쿼리 결과 로그가 생깁니다.
결과 로그를 쭉 보고 있으면 맨 처음 실행되었을 때 발생한 결과 말고 그 후의 결과는 기록되지 않는 것을 볼 수 있습니다. 응? interval 이 60이니까 1분에 한 번 실행되어야 하는 거 아닌가?
osqueryd는 매번 결과 로그를 기록하지 않습니다. 이전 쿼리 결과와 비교하여 변경 사항이 있을 경우에만 result.log 에 기록합니다.
바로 이게 osqueryd 의 핵심입니다.
osqueryd와 rsyslog의 조합. 바로 이게 오늘 이야기의 핵심입니다. osqueryd가 기록하는 로그를 별도의 파일로 기록하게 되면 그 파일을 수집하기 위해 또 다른 에이전트를 사용해야 하지만 rsyslog 에 쓰도록 조합한다면 별도의 에이전트 없이도 osqueryd 의 결과를 리모트로 수집할 수 있게 됩니다. 이를 통해서 각 서버의 주요 정보를 저장해 둘 수 있고, 변경이 일어나는 시점에 변경을 감지할 수 있습니다.
rsyslog와 조합하기에 앞서 logger_plugin 을 syslog로 변경해서 재시작해 줍니다.
그럼 아래와 같이 osqueryd 관련된 로그들이 /var/log/messages 파일에 저장되는 것을 볼 수 있습니다.
자.. 그럼 여기서 간단하게 rpm을 하나 지워볼까요? pv라는 간단한 툴 하나를 지웁니다.
네.. 이렇게 몇 시에 어떤 패키지가 지워졌는지 볼 수 있습니다. 바로 이 기능이 osquery의 핵심 기능이라고 할 수 있습니다.
osqueryd와 rsyslog를 조합하면 서버의 변경 상태를 원격에서 주기적으로 확인할 수 있습니다.
osquery + rsyslog 의 조합을 통해 위에서 보신 것처럼 서버의 변경 상태를 주기적으로 살펴볼 수 있습니다. 관리해야 할 대상 서버가 많으면 많을수록 효과적이겠죠.
잘 사용한다면 서버의 변경 감시에 사용할 수 있는 훌륭한 툴이 될 수 있다고 생각합니다.