「Linux에는 안티바이러스가 필요 없다」는 널리 퍼진 의견이고, 원래 형태 그대로라면 옳습니다. Linux 시스템 파일을 감염시키는 바이러스는 거의 없으니까요. 서버의 ClamAV에게는 다른 일이 있고, 그것은 이렇게 표현됩니다. 당신의 사이트를 통해 업로드된 것을 찾아내라. 무엇보다 웹셸을.
정확히 무엇을 찾는가
웹셸은 브라우저를 통해 명령을 실행할 수 있게 해 주는 작은 PHP 파일입니다. 업로드 폼이나 취약한 플러그인, 또는 알아맞힌 관리자 비밀번호를 통해 들어와, 업로드 디렉터리의 사진들 사이에 자리 잡고 몇 달을 삽니다. 방화벽도 Fail2ban도 그것을 보지 못합니다. 그것으로 가는 요청은 사이트로 가는 평범한 요청처럼 보이니까요.
그 밖에 ClamAV가 찾아내는 것:
- 사용자가 올려 당신의 서버에서 계속 배포되는 악성 파일 — 대개 서비스 업체가 보내는 편지의 내용이 이것입니다;
- 서버가 메일을 다룬다면 메일 첨부 파일;
- 파일 저장소의 Windows 악성 코드 — 서버 자체에는 흥미롭지 않지만 그 파일을 내려받는 직원이 피해를 봅니다.
한계에 대해서는 곧바로 말해 둡시다. ClamAV는 침해를 막지 않고 스스로 탐지하지도 않습니다. 그것이 탐지하는 것은 흔적입니다. 기존 테마 파일에 덧붙여진 미묘한 백도어는 시그니처 스캐너가 놓칩니다 — 파일 무결성 감시는 그것을 위해 있습니다.
설치와 정말 중요한 한 가지 설정
sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam
두 번째 명령이 첫 번째보다 중요합니다. freshclam은 시그니처 업데이트 서비스이며, 그것이 돌지 않으면 ClamAV는 성공적인 검사를 계속 보고하면서 쓸모없어집니다. 데이터베이스의 나이는 이렇게 확인합니다.
sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam
일주일보다 오래된 데이터베이스는 메커니즘이 망가졌다는 뜻입니다. 흔한 원인은 나가는 연결이 막혔거나, freshclam을 root로 손수 실행한 뒤 권한 때문에 서비스가 자기 파일에 쓰지 못하게 된 것입니다.
메모리: 데몬이냐 한 번의 실행이냐
사용하는 방법이 둘이고, 그 선택은 의식적이어야 합니다.
clamd는 데이터베이스를 메모리에 담고 상시 도는 데몬입니다. 빠르게 답하지만 RAM을 1 GB쯤 차지합니다. 1~2 GB짜리 VPS에서는 받아들일 수 없습니다. 데몬이 데이터베이스와 PHP-FPM을 밀어내고, 서버는 눈에 보이는 이유 없이 기어가기 시작합니다. free -m과 활성화된 swap으로 진단됩니다.
대안은 일정에 따른 clamscan입니다. 더 느리지만(실행마다 데이터베이스를 읽어 들여 1분쯤) 검사하는 동안에만 일합니다.
sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www
-i 플래그는 발견된 것만 출력합니다. 그러지 않으면 출력이 수십만 줄에 이릅니다.
디스크가 아니라 디렉터리를 검사하라
약한 서버에서 디스크 전체를 검사하면 몇 시간이 걸리고 부하가 생깁니다 — 그래서 밤으로 옮겨졌다가 아예 꺼집니다. 실제로 밖에서 바뀌는 것을 검사하는 편이 실용적입니다.
0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads
그 줄에서 중요한 것이 셋입니다. ionice와 nice는 사이트에 대한 영향을 없앱니다. --remove가 아니라 --move — 파일은 지워지는 대신 격리로 갑니다. 오탐은 생기며, 실수로 지워진 고객의 파일은 어디에서도 복구할 수 없습니다. 그리고 검사할 디렉터리는 루트가 아니라 파일이 업로드되는 곳입니다.
웹셸을 위한 시그니처
기본 ClamAV 데이터베이스는 PHP 백도어에 약합니다 — 주로 메일 트래픽을 겨냥하니까요. Linux Malware Detect(maldet)가 여기서 눈에 띄게 낫습니다. 정확히 웹셸을 중심으로 만들어진 자체 시그니처 모음이 있고, ClamAV가 설치돼 있으면 그 엔진으로 검사합니다. 흔한 조합은 엔진과 갱신되는 데이터베이스로서의 ClamAV, 전문 시그니처의 공급원으로서의 maldet입니다.
발견물로 무엇을 할 것인가
발견된 웹셸은 조사의 끝이 아니라 시작입니다. 업로드 디렉터리의 파일은 누군가 거기에 쓸 수 있었다는 뜻이고, 파일을 지운다고 그 능력이 사라지지는 않습니다.
- 곧바로 지우지 마세요 — 사본을 남기고 파일의 수정 시각을 적어 두세요.
- 그 시각으로 웹 서버 로그에서 어떤 요청이 그것을 놓았는지 찾으세요. 그것이 취약점입니다.
- 이웃을 찾으세요. 백도어가 한 부만 남는 일은 거의 없습니다.
- 같은 기간에 디스크에서 또 무엇이 바뀌었는지, 새 cron 작업과 SSH 키가 나타나지 않았는지 확인하세요.
오탐에 대해 따로 한마디. 템플릿 라이브러리와 축소된 JavaScript가 이따금 시그니처에 걸립니다. 그래서 삭제가 아니라 격리이고, 그래서 찾을 수 있는 서드파티 시그니처 모음을 모조리 붙이지 말라는 조언이 나옵니다. 절반이 잡음인 보고서에 대한 신뢰는 일주일이면 사라지고, 사람들은 그것을 읽기를 그만둡니다.
스캐너의 실용적 가치는 그 결과가 눈에 들어오는 데 있습니다. 마지막 검사가 언제 돌았는가, 데이터베이스는 얼마나 오래됐는가, 무엇이 발견됐는가. 그것은 한 줄이지만, 그 한 줄이 없으면 설치된 안티바이러스는 체크박스의 표시가 됩니다. 그 줄이 어떤 모습인지는 아래 데모 페이지에서.