๋งค์ผ 1ํ cron์ผ๋ก ์๋ ์คํ๋์ด ํธ์คํธ ๋ด๋ถ์ ์นจํด ํ์ ์ ์ฐพ์๋ด๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ก์ปฌ์ ์ ์ฅํ๋ฉด ์ด์์๊ฐ SSH๋ก ํ์ํ๋ ๋จ์ผ ์ ์คํฌ๋ฆฝํธ์ ๋๋ค. ์ธ๋ถ ํต์ ์์ด ๋์ํ๋ฏ๋ก ์คํ๋ผ์ธ ํ๊ฒฝ์์๋ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ํ๊ธฐ
์ค์น์ ์ผ์ ์ด์
- 4. ๋น ๋ฅธ ์์ (3๋ถ ์ฒดํฌ๋ฆฌ์คํธ)
- 5. ๊ฒฐ๊ณผ ํ๋ฉด ์์
- 6. ๋งค์ผ ์ด์ ๋ฃจํด
- 7. ์ค์ (secchk.conf)
- 8. ClamAV ์๊ทธ๋์ฒ USB ๋ฐ์ ์ ์ฐจ
์ ๊ฒ ๊ธฐ๋ฅ
- 9. ์ ๊ฒ ๋ชจ๋ 16๊ฐ
- 10. ์นจํด ํ์ง ์์
- 11. ๊ฒฐ๊ณผ ์ฐ์ถ๋ฌผ ๊ตฌ์กฐ
- 12. ์ฒซ 8์ผ โ WARMUP_PERIOD
์ฌ๊ณ ๋์๊ณผ ํ๊ณ
- 13. HIGH ๋ฐ๊ฒฌ ์ ๋์
- 14. ์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
- 15. ์ด ์คํฌ๋ฆฝํธ์ ํ๊ณ์ ๋ณด์ ๋ฐฉ๋ฒ
์ฐธ๊ณ
๋ฐฉํ๋ฒฝยทWAFยทIDS ๊ฐ์ ๋คํธ์ํฌ ์ฅ๋น๋ง์ผ๋ก๋ "์ด ์๋ฒ ๋ด๋ถ๊ฐ ์ค์ ๋ก ์นจํด๋๋๊ฐ?"๋ฅผ ์๊ธฐ ์ด๋ ต์ต๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋ ๊ฐ ์๋ฒ์์ ์์ฒด์ ์ผ๋ก ์นจํด์ ํ์ ์ ์ฐพ๋ 16์ข ์ ๊ฒ์ ๋งค์ผ 1ํ ์ํํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์ด์์๊ฐ ๋งค์ผ 1๋ถ ์์ ํ์ธํ ์ ์๋ ํํ๋ก ์ ๋ฆฌํด์ค๋๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋์ ๋ฐฉ์ | ๊ฐ ์๋ฒ์์ cron์ผ๋ก ๋งค์ผ 1ํ ์คํ |
| ํต์ | ์ธ๋ถ ํต์ 0๊ฑด (์ธ๋ถ ํต์ ์์ด ๋จ๋ ๋์ (์คํ๋ผ์ธ ํ๊ฒฝ ํฌํจ)) |
| ๊ฒฐ๊ณผ ํ์ | ๋ก์ปฌ ํ์ผ๋ก ์ ์ฅ, ์ด์์๊ฐ SSH๋ก ์ง์ ํ์ |
| ๋ฐฐํฌ ๋จ์ | ๋จ์ผ ํ์ผ secchk.sh ํ๋๋ง USB๋ก ๋ฐ์
|
| ์ธ๋ถ ์์กด์ฑ | ClamAV ์๊ทธ๋์ฒ๋ง USB๋ก ์ ๊ธฐ ๋ฐ์
(์ต์
, --no-clamav๋ก ๋ ์ ์์) |
| ๋์ OS | RHEL/CentOS ๊ณ์ด, Ubuntu/Debian ๊ณ์ด (์๋ ๊ฐ์ง) |
| ๊ถํ | root๋ก ์คํ (์์คํ ํ์ผ ์ ๊ทผ ํ์) |
์ด ์คํฌ๋ฆฝํธ๋ ์นจํด ํ์ ์ ์ฐพ๋ ๋๊ตฌ์ด์ง ์ฐจ๋จํ๋ ๋๊ตฌ๊ฐ ์๋๋๋ค. ๋ฐ๊ฒฌ๋ ์ ํธ๋ฅผ ๋ณด๊ณ ๋ค์ ํ๋(๋ณด์กดยท๊ฒฉ๋ฆฌยทํฌ๋ ์)์ ๊ฒฐ์ ํ๋ ๊ฒ์ ์ด์์์ SOP์ ๋๋ค.
์คํ ํ๋ฆ
๋งค์ผ 03:30 cron
โ
โผ
secchk.sh --mode daily (16๊ฐ ์ ๊ฒ ๋ชจ๋ ์์ฐจ ์คํ)
โ
โผ
output/YYYYMMDD/ + output/latest ์ฌ๋ณผ๋ฆญ๋งํฌ ๊ฐฑ์
16๊ฐ ์ ๊ฒ ๋ชจ๋ ๊ทธ๋ฃน
| ๊ทธ๋ฃน | ๋ชจ๋ |
|---|---|
| ๊ณ์ ยท์ ๊ทผ | 10 ๊ณ์ / 11 ๋ก๊ทธ์ธ ์ด๋ ฅ / 16 SSH ์ธ์ฆ |
| ๋คํธ์ํฌ | 12 ๋คํธ์ํฌ ์ํ / 21 ๋คํธ์ํฌ ์ค์ |
| ํ๋ก์ธ์คยทํ์ผ | 13 ํ๋ก์ธ์ค / 14 ํ์ผ ์ด์ / 15 ์ง์์ฑ |
| ์์คํ ๋ฌด๊ฒฐ์ฑ | 18 ๋ก๊ทธ ๋ณ์กฐ / 19 ์ปค๋ ๋ชจ๋ / 20 ํจํค์ง ๋ฌด๊ฒฐ์ฑ |
| ์์ฉ ์์ญ | 17 ์น์ / 22 ๋ฉ์ผ ํ / 23 ์ปจํ ์ด๋ |
| ์ํฐ๋ฐ์ด๋ฌ์ค | 24 ClamAV / 25 rkhunter(์ต์ ) |
์ฐ์ถ๋ฌผ (output/YYYYMMDD/)
| ํ์ผ | ์ฉ๋ |
|---|---|
SUMMARY.txt |
๋งค์ผ ํ ์ค ์์ฝ (๊ฐ์ฅ ์์ฃผ ๋ณด๋ ํ์ผ) |
report.html |
๋ธ๋ผ์ฐ์ ์ฉ ์นด๋ํ ๋ฆฌํฌํธ |
result.json |
JSONL ์์ธ |
diff_from_yesterday.txt |
์ด์ ์ ์ค๋์ ๋ฐ๊ฒฌ ์ฐจ์ด |
full.log |
์คํ ๋ก๊ทธ |
์ถ๊ฐ๋ก output/ ๋ฃจํธ์๋ latest ์ฌ๋ณผ๋ฆญ๋งํฌ์ ์ผ์๋ณ ๋์ ์ธ SUMMARY_INDEX.txt๊ฐ ์๋ ์์ฑ๋ฉ๋๋ค.
ํต์ฌ ๋์ ์๋ฆฌ ๋ ๊ฐ์ง
- ์ด์ vs ์ค๋ ์๊ฐ diff โ "๊ฐ์๊ธฐ ์๊ธด ๊ฒ"์ ํ์ง. ์ด์ ์๋ SSH ํค, ์ด์ ์๋ LISTEN ํฌํธ, ์ด์ ์๋ SUID ํ์ผ ๋ฑ.
- ์๋ ค์ง ์ ์๊ฐ๊ณผ ๋น๊ต โ ๋ฐฐํฌํ ํจํค์ง์ ๋ค์ด์๋ ์ ์ ํด์(
rpm -V/debsums)์ ํ์ฌ ์์คํ ํ์ผ์ ๋น๊ตํ์ฌ ๋ณ์กฐ ํ์ง.
์ด์์๊ฐ ์ฒ์ ํ ๋ฒ๋ง ๋ฐ๋ผํ๋ฉด ๋์ ๋๋ค.
sudo mkdir -p /opt/secchk
sudo cp secchk.sh /opt/secchk/
sudo cp -r patterns/ /opt/secchk/
sudo cp etc/secchk.conf.sample /etc/secchk.conf
sudo chmod 700 /opt/secchk/secchk.sh
sudo chmod 600 /etc/secchk.conf/etc/secchk.conf๋ฅผ ์ด์ด ํ๊ฒฝ์ ๋ง๊ฒ ์์ ํฉ๋๋ค (์์ธํ ๋ด์ฉ์ 7. ์ค์ ).
# ์ต์ํ ๋ค์ ๋ ๊ฐ์ง๋ง ํ์ธํ๋ฉด ๋ฉ๋๋ค.
WEB_ROOTS="/var/www /usr/share/nginx/html" # ์น ์๋ฒ ์๋๋ฉด ๋น ๊ฐ
TRUSTED_DNS="" # ์ธ๋ถ ๊ณต์ฉ DNS(8.8.8.8 ๋ฑ)๋ฅผ ์ ์์ผ๋ก
# ์ฌ์ฉํ๋ ํ๊ฒฝ์์๋ง ๊ทธ IP๋ฅผ ๋ฑ๋ก.
# ์ฌ๋ด DNS๋ ์ฌ์ค๋ง IP๋ผ ์๋ ์ ๋ขฐ๋จ.sudo tee /etc/cron.d/secchk > /dev/null <<'EOF'
SHELL=/bin/bash
30 3 * * * root /opt/secchk/secchk.sh --mode daily >/dev/null 2>&1
EOF
sudo chmod 600 /etc/cron.d/secchksudo /opt/secchk/secchk.sh --mode daily
cat /opt/secchk/output/latest/SUMMARY.txtโ STATUS:CLEAN ์ด ๋์ค๋ฉด ์ฑ๊ณต์
๋๋ค. ๊ฐ๋ ์ฒซ 8์ผ ๋์์๋ ์์ WARMUP_PERIOD ํ๊ทธ๊ฐ ํจ๊ป ํ์๋ ์ ์์ต๋๋ค (์ ์).
ClamAV๋ฅผ ์ฐ๋ ค๋ฉด 8. ClamAV ์๊ทธ๋์ฒ USB ๋ฐ์
์ ์ฐจ๋ฅผ ์ฐธ์กฐํ์ธ์. ์ ์ฐ๋ ค๋ฉด cron ๋ผ์ธ์ --no-clamav๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
๊ฐ๋ ํ ์ฒซ 8์ผ์ ๋น๊ต ๊ธฐ์ค์ด ๋ถ์กฑํ๋ฏ๋ก ์์ ํ ๊ธฐ๊ฐ์
๋๋ค. SUMMARY์ WARMUP_PERIOD ํ๊ทธ๊ฐ ํ์๋๋ฉฐ, ์ด์ ๋น๊ต ๊ฒ์ฌ๋ INFO๋ก ๊ฒฉํ๋ฉ๋๋ค. 8์ผ์ด ์ง๋๋ฉด ์๋ ์ ์ ๋ชจ๋๋ก ์ง์
ํฉ๋๋ค (12. ์ฒซ 8์ผ).
์ ์ ์ํ์ผ ๋ SUMMARY.txt ํ ์ค๊ณผ HTML ๋ฆฌํฌํธ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ ๋๋ค.
$ cat /opt/secchk/output/latest/SUMMARY.txt
[2026-05-30 03:30:12] HIGH:0 MEDIUM:0 LOW:0 INFO:4 ERROR:0 ELAPSED:7s STATUS:CLEAN HOST:web01 MODE:daily
๋ธ๋ผ์ฐ์ ์์ ๋ณธ report.html ํ๋ฉด (์ ์ ์ํ):
์ ์ด๋ฏธ์ง๋ ์ค์
secchk.sh๊ฐ ์์ฑํoutput/latest/report.html์ ๊ทธ๋๋ก ์บก์ฒํ ๊ฒ์ ๋๋ค. ์ด์์๊ฐscp๋ก ๋ฐ์ ๋ธ๋ผ์ฐ์ ๋ก ์ด๋ฉด ๊ฐ์ ํ๋ฉด์ ๋ด ๋๋ค.
SUMMARY ์ STATUS: ๋ ์ธ ๋จ๊ณ์
๋๋ค.
| STATUS | ์๋ฏธ |
|---|---|
CLEAN |
HIGH/MEDIUM ๋ฐ๊ฒฌ ์์. ์ค๋์ ํ์๋๋ก. |
WARN |
MEDIUM ๋ฐ๊ฒฌ ์์. HIGH ๋ ์์ง๋ง ํ ๋ฒ ๊ฒํ ๊ถ์ฅ. |
ALERT |
HIGH ๋ฐ๊ฒฌ 1๊ฑด ์ด์. ์ฆ์ ํ์ธ ํ์. |
ssh web01 'cat /opt/secchk/output/latest/SUMMARY.txt'์ถ๋ ฅ ์์:
[2026-05-30 03:30:12] HIGH:0 MEDIUM:0 LOW:0 INFO:4 ERROR:0 ELAPSED:7s STATUS:CLEAN HOST:web01 MODE:daily
STATUS:CLEAN ์ด๋ฉด ๋. STATUS:WARN ์ด๋ฉด ํ ๋ฒ ํ์ด๋ณด๊ณ , STATUS:ALERT ์ด๋ฉด ์ฆ์ ์์ธ ํ์ธ์ผ๋ก ๋์ด๊ฐ๋๋ค.
# ์ด์ ์ ์ค๋์ ์ฐจ์ด ํ์ธ
ssh web01 'cat /opt/secchk/output/latest/diff_from_yesterday.txt'
# HIGH ํญ๋ชฉ๋ง ์ถ์ถ
ssh web01 'grep "HIGH" /opt/secchk/output/latest/result.json'
# HTML ๋ค์ด๋ก๋ํด์ ๋ธ๋ผ์ฐ์ ๋ก ์์ธํ
scp web01:/opt/secchk/output/latest/report.html ./web01-$(date +%Y%m%d).html#!/bin/bash
# check_all.sh โ ์ด์์ PC์์ ์คํ
for srv in web01 web02 db01 app01; do
printf '%-8s ' "$srv"
ssh "$srv" 'cat /opt/secchk/output/latest/SUMMARY.txt 2>/dev/null || echo "NO_DATA"'
donessh web01 'tail -30 /opt/secchk/output/SUMMARY_INDEX.txt'์ถ๋ ฅ ์์:
2026-05-23 03:30 HIGH:0 MEDIUM:1 LOW:0 CLEAN
2026-05-24 03:30 HIGH:0 MEDIUM:1 LOW:0 CLEAN
2026-05-25 03:31 HIGH:0 MEDIUM:1 LOW:0 CLEAN
2026-05-26 03:30 HIGH:3 MEDIUM:5 LOW:1 ALERT โ
2026-05-27 03:30 HIGH:0 MEDIUM:1 LOW:0 CLEAN
โ
ํ์๊ฐ ์๋ ๋ ์ ALERT๊ฐ ๋ฐ์ํ ๋ ์ด๋ฉฐ, ํด๋น ์ผ์ ๋๋ ํ ๋ฆฌ๋ ์๋ ๋ณด์กด๋ฉ๋๋ค (retention ์ ์ฑ
๋ฌด์).
์ค์ ํ์ผ์ ๋ค์ ์ฐ์ ์์๋ก ์๋ ํ์๋ฉ๋๋ค.
--config <๊ฒฝ๋ก>์ธ์/etc/secchk.confsecchk.sh์ ๊ฐ์ ๋๋ ํ ๋ฆฌ์secchk.conf- ์์ผ๋ฉด ์คํฌ๋ฆฝํธ ๋ด์ฅ ๊ธฐ๋ณธ๊ฐ
etc/secchk.conf.sample์ ๋ณต์ฌํด์ ์์ํฉ๋๋ค.
# โโโ ์ ๊ฒ ๋์ ๋๋ ํ ๋ฆฌ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# HOTSPOTS: ๋งค์ผ ์ ๊ฒํ ํซ์คํ (๊ณต๊ฒฉ ํ์ 1์์ + ๋ณ๋ ์ฆ์ ๊ณณ)
HOTSPOTS="/tmp /dev/shm /var/tmp /var/www /usr/share/nginx /opt/tomcat/webapps"
# ROTATE_<์์ผ>: ์์ผ๋ณ 1/7์ฉ ์ ๊ฒํ ์ฝ๋ ์์ญ (7์ผ์ ํ ๋ฐํด)
ROTATE_Mon="/etc"
ROTATE_Tue="/usr/bin /bin"
ROTATE_Wed="/usr/sbin /sbin"
ROTATE_Thu="/home"
ROTATE_Fri="/root /opt"
ROTATE_Sat="/usr/local /srv"
ROTATE_Sun="/var/spool /var/lib"
# โโโ ์น์ ์ ๊ฒ ๋์ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
WEB_ROOTS="/var/www /usr/share/nginx/html /opt/tomcat/webapps"
# โโโ ์ ๋ขฐ ์ธ๋ถ DNS (์ฌ์ค๋ง ์ธ IP ์ค ์ ์์ผ๋ก ์ธ์ ํ ๊ฒ๋ง ๋ฑ๋ก) โโโโโ
# ์ฌ๋ด DNS๋ ๋ณดํต ์ฌ์ค๋ง IP๋ผ ์๋ ์ ๋ขฐ๋ฉ๋๋ค. ์ธ๋ถ ๊ณต์ฉ DNS(8.8.8.8 ๋ฑ)๋ฅผ
# ์ ์ ์ด์์ ์ฐ๋ ํ๊ฒฝ์์๋ง ๊ทธ IP๋ฅผ ๋ฑ๋กํ์ธ์. ๊ทธ ์ธ ํ๊ฒฝ์์๋ ๋น ๊ฐ.
TRUSTED_DNS=""
# โโโ ๊ฒฐ๊ณผ ๋ณด๊ด / ์์ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
KEEP_DAYS=30 # 30์ผ ์ด๊ณผ ๋๋ ํ ๋ฆฌ ์๋ ์ญ์ (HIGH ์ผ์๋ ๋ณด์กด)
MIN_FREE_MB=1024 # ๋์คํฌ ์ฌ์ 1GB ๋ฏธ๋ง์ด๋ฉด ์ ๊ฒ ์ค๋จ
THROTTLE_SLEEP=0.1 # ์ ๊ฒ ํญ๋ชฉ ์ฌ์ด sleep (๋ถํ ๋ถ์ฐ)
CLAMAV_MAX_VMEM_KB=1500000 # ClamAV ๋ฉ๋ชจ๋ฆฌ ์ํ (1.5GB)
# โโโ ์๊ณ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
FAILED_LOGIN_THRESHOLD=20 # ๋์ผ IP ๋ก๊ทธ์ธ ์คํจ ์๊ณ
MAIL_QUEUE_THRESHOLD=100 # ๋ฉ์ผ ํ ์๊ณ
# โโโ ํต์ฌ ํจํค์ง ํ ๊ฒ์ฆ (20_system_integrity) โโโโโโโโโโโโ
# ๋ณ์กฐ๋๋ฉด ๊ฑฐ์ ํ์คํ ์นจํด์ธ ์์คํ
๋ช
๋ น์ด ํจํค์ง. ๋ณดํธ ๋์ ์ถ๊ฐ ์ ์ฌ๊ธฐ์.
CORE_PKGS_RHEL="coreutils util-linux procps-ng net-tools iproute openssh-server openssh-clients shadow-utils pam"
CORE_PKGS_DEBIAN="coreutils util-linux procps net-tools iproute2 openssh-server openssh-client login libpam-modules libpam-runtime"์ ์ฒด ๋์คํฌ๋ฅผ ๋งค์ผ ํ์ค์บํ๋ฉด ๋ถํ๊ฐ ํฝ๋๋ค. ๊ทธ๋์ ์์ฃผ ๋ณํ๊ณ ๊ณต๊ฒฉ ํ์ ์ธ ์์ญ(/tmp, ์น ๋ฃจํธ ๋ฑ)์ ๋งค์ผ ์ ๊ฒํ๊ณ , ๋ณ๋์ด ์ ์ ์์คํ
์์ญ(/etc, /usr/bin ๋ฑ)์ ์์ผ๋ณ 1/7์ฉ ๋๋ ์ ์ ๊ฒํฉ๋๋ค. ์ผ์ฃผ์ผ์ด ์ง๋๋ฉด ๋ชจ๋ ๋๋ ํ ๋ฆฌ๊ฐ ์ต์ 1ํ์ฉ ๊ฒ์ฌ๋ฉ๋๋ค.
ClamAV๋ ์๋ ค์ง ์ ์ฑ์ฝ๋ ์๊ทธ๋์ฒ์ ๋์คํฌ ํ์ผ์ ๋น๊ตํ๋ ์ํฐ๋ฐ์ด๋ฌ์ค์ ๋๋ค. ์๊ทธ๋์ฒ ๊ฐฑ์ ์ ์ํด ์ธ๋ถ ์ธํฐ๋ท์ด ํ์ํ๋ฏ๋ก, ์ธ๋ถ ์ธํฐ๋ท์ด ์๋ ํ๊ฒฝ์์๋ USB๋ก ์ ๊ธฐ ๋ฐ์ ํด์ผ ํฉ๋๋ค.
# Ubuntu/Debian
sudo apt install -y clamav-freshclam
sudo systemctl stop clamav-freshclam
sudo freshclam
# RHEL/CentOS
sudo dnf install -y clamav-update
sudo freshclam๋ค์ ์ธ ํ์ผ์ด /var/lib/clamav/์ ์์ฑ๋ฉ๋๋ค.
main.cvd(์ฝ 200MB) โ ๋ฉ์ธ ์๊ทธ๋์ฒdaily.cvd(์ฝ 30MB) โ ์ผ์ผ ์ถ๊ฐ ์๊ทธ๋์ฒbytecode.cvd(์ฝ 300KB) โ ๋ฐ์ดํธ์ฝ๋ ๋ฃฐ
mkdir -p /mnt/usb/clamav
cd /var/lib/clamav
sudo cp main.cvd daily.cvd bytecode.cvd /mnt/usb/clamav/
cd /mnt/usb/clamav
sha256sum *.cvd > checksums.txt# ์ฒดํฌ์ฌ ๊ฒ์ฆ
cd /mnt/usb/clamav
sha256sum -c checksums.txt
# ์ ์์ด๋ฉด ๋ฐฐ์น
sudo cp main.cvd daily.cvd bytecode.cvd /var/lib/clamav/
sudo chown clamav:clamav /var/lib/clamav/*.cvd
sudo chmod 644 /var/lib/clamav/*.cvdclamscan --version
# โ ClamAV 1.4.4/27420/Thu May 30 02:58:38 2026๋ค์ daily ์ ๊ฒ ์ ์๋์ผ๋ก ์ ์๊ทธ๋์ฒ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ถ๊ธฐ 1ํ ์ด์ (๊ฐ๋ฅํ๋ฉด ์ 1ํ). ์๊ทธ๋์ฒ ํ์ผ์ด 30์ผ์ ๋์ผ๋ฉด secchk ๊ฐ ์๋์ผ๋ก MEDIUM stale_signature ๊ฒฝ๊ณ ๋ฅผ ๋์๋๋ค.
๊ฐ ๋ชจ๋์ ๋ฌด์์ ๋ณด๋์ง / ์ ๋ณด๋์ง / ํ์ง๋๋ฉด ์ด๋ป๊ฒ์ 3๋ถ ๊ตฌ์กฐ๋ก ์ค๋ช ํฉ๋๋ค.
16๊ฐ ๋ชจ๋์ด ์ ์๋์ด ์์ง๋ง, ํ๊ฒฝ ์กฐ๊ฑด์ด ์ ๋ง์ผ๋ฉด ์ผ๋ถ๋ ์๋์ผ๋ก ๊ฑด๋๋๋๋ค. ์) ๋ฉ์ผ ๋ฐ๋ชฌ(postfix/sendmail)์ด ์์ผ๋ฉด 22 ์๋ skip, docker/podman ๋ ๋ค ์์ผ๋ฉด 23 ์๋ skip, ClamAV ๋ฏธ์ค์น์ด๊ฑฐ๋
--no-clamav์ด๋ฉด 24 skip, rkhunter๋--with-rkhunter์ต์ ์ฌ์ฉ ์์๋ง ๋์.SUMMARY.txt/result.json์ INFO ํญ๋ชฉ์ผ๋ก skip ์ฌ์ ๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค.
๋ฌด์์ ๋ณด๋์?
/etc/passwd,/etc/shadow,/etc/groupํ์ผ์ ํด์๊ฐ ์ด์ ์ ๋ค๋ฅธ์ง- root ๊ถํ(UID 0)์ ๊ฐ์ง ๊ณ์ ์ด root ์ธ์ ๋ ์๋์ง
- ๋น์ด์๋ ํจ์ค์๋๋ฅผ ๊ฐ์ง ๊ณ์ ์ด ์๋์ง
- ์ด์ ์๋ ์ ๊ท ๊ณ์ ์ด ์ถ๊ฐ๋๋์ง
- sudoers ํ์ผ์ "ํจ์ค์๋ ์์ด sudo ๊ฐ๋ฅ(NOPASSWD)" ๋ผ์ธ์ด ์๋ก ์๊ฒผ๋์ง
- ๋ก๊ทธ์ธ์ด ๋งํ ์์คํ
๊ณ์ (
/sbin/nologin)์ธ๋ฐ SSH ํค๋ง ๋ฑ๋ก๋์ด ์๋์ง .bash_historyํ์ผ์ด ์ฌ๋ณผ๋ฆญ๋งํฌ๋ก ๋ฐ๋์๋์ง (ํ์คํ ๋ฆฌ ๋ฌด๋ ฅํ ์์ฌ)
์ ๋ด์ผ ํ๋์? ๊ณต๊ฒฉ์๊ฐ ์๋ฒ๋ฅผ ์ฅ์ ํ ํ ๊ฐ์ฅ ๋จผ์ ํ๋ ์ผ์ด "๋ค์์ ๋ค์ ๋ค์ด์ฌ ํต๋ก ๋ง๋ค๊ธฐ"์ ๋๋ค. ์ ์ฌ์ฉ์ ๊ณ์ ์ ์ฌ์ฉ ์ถ๊ฐํ๊ฑฐ๋, sudo๋ฅผ ํจ์ค์๋ ์์ด ์ธ ์ ์๊ฒ ๋ง๋ค๊ฑฐ๋, ๋ก๊ทธ์ธ ๋งํ์๋ ์์คํ ๊ณ์ ์ SSH ํค๋ฅผ ์ฌ์ต๋๋ค. ์ ์ ์ด์์์ ์ด๋ฐ ๋ณ๊ฒฝ์ ์ด์์๊ฐ ์๊ธฐ ์์ผ๋ก ํ ์ผ์ด๋ผ ์๊ณ ์์ง๋ง, ์นจํด ์์๋ ๋ชจ๋ฅด๊ฒ ์ผ์ด๋ฉ๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
result.json์์ ์ด๋ค ๊ฒ์ฌ๊ฐ ์กํ๋์ง ํ์ธ- ์ด์ํ์ "์ด ๊ณ์ ๋ง๋์ ๋ถ ๊ณ์ ๊ฐ์?" ํ์ธ
- ๋ชจ๋๊ฐ "๋ชจ๋ฅธ๋ค"๊ณ ๋ตํ๋ฉด ์นจํด ์์ฌ โ ๊ฒฐ๊ณผ ๋ณด์กด ํ ๊ฒฉ๋ฆฌ ๊ฒํ
- ์ ์ ์ถ๊ฐ๋ผ๋ฉด ์ด์ ๊ธฐ๋ก์ ๋ฑ๋ก
๋ฌด์์ ๋ณด๋์?
last๋ก ์๋ฒฝ 2~5์ root ์ฑ๊ณต ๋ก๊ทธ์ธ์ด ์๋์ง (์ธ๋ถ IP๋ ๊ฐ์กฐ)lastb๋ก ๋์ผ IP์์ ์๊ณ(๊ธฐ๋ณธ 20ํ) ์ด์ ์คํจ๊ฐ ์๋์ง- ๊ฐ์ ์ฌ์ฉ์ ๊ณ์ ์ด 1์๊ฐ ์์ 3๊ฐ ์ด์ ์๋ก ๋ค๋ฅธ ํธ์คํธ์์ ๋ก๊ทธ์ธํ๋์ง
์ ๋ด์ผ ํ๋์? ์ ์ ์ด์์๋ ์ ๋ฌด ์๊ฐ์ ์ต์ํ ์ฌ๋ด IP์์ ์ ์ํฉ๋๋ค. ์๋ฒฝ ๋ฌด์ธ ์๊ฐ๋์ root ์ ์์ด๋, ์งง์ ์๊ฐ์ ์ฌ๋ฌ IP์์ ๊ฐ์ ๊ณ์ ๋ก๊ทธ์ธ์ด ์ฑ๊ณตํ๋ ๊ฑด ์๊ฒฉ์ฆ๋ช ํ์ทจ์ ์ ํธ์ผ ์ ์์ต๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- ์ธ๋ถ IP์์์ ์๋ฒฝ root ์ ์์ด๋ฉด: ๋ฐฉํ๋ฒฝ ๋ฃฐ ๊ฒํ + ํจ์ค์๋/SSH ํค ์ฆ์ ์ฌ๋ฐ๊ธ
- ๋์ผ IP ๋ฌด์ฐจ๋ณ ์คํจ๊ฐ ์๊ณ ์ด๊ณผ๋ฉด: ํด๋น IP ์ฐจ๋จ
- ๋ค์ค IP ๋์ ๋ก๊ทธ์ธ์ด๋ฉด: ๊ณ์ ํ์ทจ ์์ฌ โ ํจ์ค์๋ ๋ณ๊ฒฝ
์ฐธ๊ณ : ๋ณธ ๋ชจ๋์ ์ ๋ณด์ฑ์ด ๊ฐํด ๋๋ถ๋ถ MEDIUM/INFO์ ๋๋ค. ์ ์ ์ผ๊ฐ ์์ ์ด ์กํ๋ฉด ์ด์ํ์ด ์ธ์งํ๊ณ ์๋์ง๋ง ํ์ธํ๋ฉด ๋ฉ๋๋ค.
๋ฌด์์ ๋ณด๋์?
- TCP/UDP LISTEN ํฌํธ ๋ชฉ๋ก์ด ์ด์ ์ ๋ค๋ฅธ์ง (์ ๊ท LISTEN์ HIGH)
- ESTABLISHED ์ฐ๊ฒฐ ์ค ์ฌ๋ด๋ง(10.x, 172.16~31.x, 192.168.x) ์ธ IP๊ฐ ์๋์ง
- ARP ํ ์ด๋ธ์ ๊ฐ์ IP์ ์ฌ๋ฌ MAC, ๋๋ ๊ฐ์ MAC์ ์ฌ๋ฌ IP๊ฐ ๋ณด์ด๋์ง
- ๋ฐฉํ๋ฒฝ ์ค์ (
iptables-save,firewall-cmd,ufw)์ด ์ด์ ์ ๋ค๋ฅธ์ง
์ ๋ด์ผ ํ๋์? ๊ณต๊ฒฉ์๊ฐ ์๋ฒ์ ๋ฐฑ๋์ด๋ฅผ ์ค์นํ๋ฉด ์ธ๋ถ์์ ๋ค์ ์ ์ํ๊ธฐ ์ํ ํฌํธ๋ฅผ ์ด๊ฑฐ๋ (Bind shell), ๊ณต๊ฒฉ์ ์๋ฒ๋ก ์ ๊ธฐ ์ฐ๊ฒฐ์ ๋ง๋ญ๋๋ค (Reverse shell). ๋ ๋ค ๋คํธ์ํฌ ์ํ์ ํ์ ์ด ๋จ์ต๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- ์ ๊ท LISTEN ํฌํธ์ ํ๋ก์ธ์ค๋ฅผ ์ฐพ๊ธฐ:
ss -tnlp | grep :<ํฌํธ> - ๊ทธ ํ๋ก์ธ์ค์ ๋ฐ์ด๋๋ฆฌ ๊ฒฝ๋ก ํ์ธ:
ls -la /proc/<pid>/exe - ๋นํ์ค ์์น(
/tmp,/dev/shm)์์ ๋์์ก๋ค๋ฉด ์นจํด ํ์ โ ์ฆ์ ๊ฒฉ๋ฆฌ - ์ ์ ์๋น์ค ๋์ ์ด๋ฉด ์ด์ ๊ธฐ๋ก์ ๋ฑ๋ก
๋ฌด์์ ๋ณด๋์?
/proc์๋ ๋ณด์ด๋๋ฐps๋ก๋ ๋ณด์ด์ง ์๋ "์จ๊ฒจ์ง PID" (1์ด ๊ฐ๊ฒฉ 2ํ ์ธก์ ํด ๊ฑฐ์ง์์ฑ ์ ๊ฑฐ)- ํ๋ก์ธ์ค ๋ฐ์ด๋๋ฆฌ๊ฐ ๋์คํฌ์์ ์ญ์ ๋๋๋ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋๊ณ ์๋ ๊ฒฝ์ฐ(
(deleted)) /tmp,/dev/shm,/var/tmp๊ฐ์ ์์ ๋๋ ํ ๋ฆฌ์์ ์คํ ์ค์ธ ํ๋ก์ธ์ค- ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ init(PID 1)์ธ๋ฐ ์ผ๋ฐ ์ฌ์ฉ์ ๊ถํ์ธ ๊ฒฝ์ฐ
- ์์ ๋๋ ํ ๋ฆฌ์ ์๋
.soํ์ผ์ ๋ฉ๋ชจ๋ฆฌ ๋งคํํ ํ๋ก์ธ์ค (์ฝ๋ ์ธ์ ์ ์์ฌ)
์ ๋ด์ผ ํ๋์?
LKM ๋ฃจํธํท์ ps ๋ช
๋ น์ ๊ฒฐ๊ณผ์์ ์๊ธฐ PID๋ฅผ ์จ๊น๋๋ค. ํ์ง๋ง ์ปค๋์ด ์ง์ ๋
ธ์ถํ๋ /proc/<pid>/๋ ๊ฐ๋ฆด ์ ์์ผ๋ฏ๋ก, ์ด ๋์ ์ฐจ์ด๊ฐ ๋ฃจํธํท ํ์ง์ ๊ฒฐ์ ์ ๋จ์๊ฐ ๋ฉ๋๋ค. ๋ ๋ฉ๋ชจ๋ฆฌ ์์ฃผ ์
์ฑ์ฝ๋๋ ๋์คํฌ ํ์ผ์ ์ง์ ํ์ ์ ์์ ์ง๋ง, /proc/<pid>/exe ์ฌ๋ณผ๋ฆญ๋งํฌ๊ฐ (deleted)๋ก ๋จ์ ์กํ๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- ์ฆ์ ๋คํธ์ํฌ ๊ฒฉ๋ฆฌ (๊ณต๊ฒฉ์ ์ฌ์ ์ ์ฐจ๋จ)
cat /proc/<pid>/cmdline,readlink /proc/<pid>/exe๋ก ์ถ๊ฐ ์ ๋ณด ์์ง/proc/<pid>/exe๋ฅผ ๋ค๋ฅธ ์์น์ ๋ณต์ฌํด ๋ถ์์ฉ ๋ณด์กด- ๋ฉ๋ชจ๋ฆฌ dump ๋ฐ ์ ๋ฌธ ํฌ๋ ์ ๋๊ตฌ๋ก ๋ถ์
- ๋ฃจํธํท ์์ ์ ๊ฑฐ๊ฐ ์ด๋ ค์ฐ๋ฉด ์์คํ ์ฌ์ค์น ๊ฒํ
๋ฌด์์ ๋ณด๋์? ํซ์คํ(๋งค์ผ) + ์ค๋ ์์ผ์ ์ฝ๋ ์์ญ(์ฃผ 1ํ)์์:
- ์ด์ ์๋ SUID/SGID ํ์ผ (๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์คํ๋๋ ํ์ผ)
- ์ด์ ์๋ world-writable ํ์ผ (๋๊ตฌ๋ ์์ ๊ฐ๋ฅํ ํ์ผ)
- 24์๊ฐ ์์ ๋ณ๊ฒฝ๋ ํ์ผ ๋ชฉ๋ก
/tmp,/dev/shm,/var/tmp์ ์จ๊น ํ์ผ ๋๋ ์คํ๊ถํ ํ์ผ (7์ผ ๋ด ์์ฑ)
์ ๋ด์ผ ํ๋์?
SUID ํ์ผ์ ์ผ๋ฐ ์ฌ์ฉ์๊ฐ ์คํํด๋ ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ๋์ํฉ๋๋ค. ๊ณต๊ฒฉ์๊ฐ ์๊ธฐ ๋ฐฑ๋์ด์ SUID๋ฅผ ๋ถ์ด๋ฉด ์ผ๋ฐ ์ฌ์ฉ์ ๊ถํ๋ง ๊ฐ์ง๊ณ ๋ ๊ด๋ฆฌ์ ๊ถํ์ ์ป์ ์ ์์ต๋๋ค. /tmp๋ /dev/shm์ ์จ๊น ์คํ ํ์ผ(.x, .sshd ๊ฐ์)์ ๊ฑฐ์ ํญ์ ์นจํด ํ์ ์
๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- ์ ๊ท SUID ํ์ผ์ด๋ฉด:
stat์ผ๋ก ์์ ์/์์ฑ ์๊ฐ ํ์ธ - ์ ์ ํจํค์ง์ธ์ง ํ์ธ:
rpm -qf <ํ์ผ>๋๋dpkg -S <ํ์ผ> - ํจํค์ง์ ์ํ์ง ์์ผ๋ฉด ์นจํด ๊ฐ๋ฅ์ฑ โ ๋ณด์กด ํ ๊ฒฉ๋ฆฌ
/tmp/.x๊ฐ์ ํจํด์ 13_process์ ๊ต์ฐจ ํ์ธ (์ค์ ์คํ ์ค์ธ์ง)
๋ฌด์์ ๋ณด๋์?
cron๊ด๋ จ ์์น ์ ์ฒด(/etc/crontab,/etc/cron.{hourly,daily,weekly,monthly}/*,/var/spool/cron/*)๊ฐ ์ด์ ์ ๋ค๋ฅธ์ง- ์ ๊ท systemd timer๊ฐ ๋ฑ๋ก๋๋์ง
/etc/rc.local,/etc/init.d/*์ ๋ณ๊ฒฝ์ด ์๋์ง/etc/ld.so.preloadํ์ผ์ ์กด์ฌ ์์ฒด (๋๋ถ๋ถ ์์คํ ์์ ์๋ ๊ฒ ์ ์)LD_PRELOADํ๊ฒฝ๋ณ์๊ฐ systemd ์๋น์ค / ์์คํ ํ๊ฒฝ ํ์ผ / ์ฌ์ฉ์ ์ ธ ์ค์ ์ ์๋์ง/etc/profile,/etc/bashrc๋ฑ์ ์์ฌ ๋ช ๋ น(curl,wget,nc,bash -i,/dev/tcp/)์ด ๋ค์ด ์๋์ง/etc/skel/์ ์ต๊ทผ 30์ผ ๋ด ๋ณ๊ฒฝ์ด ์๋์ง (์ ๊ณ์ ๋ง๋ค ์๋ ๊ฐ์ผ)
์ ๋ด์ผ ํ๋์?
๊ณต๊ฒฉ์๊ฐ ๋ค์ด์๋ค ๋๊ฐ๋ฉด ๋์ด ์๋๋๋ค. ์ฌ๋ถํ
ํ์๋ ๋ค์ ์คํ๋๋๋ก ๋ฐฑ๋์ด๋ฅผ ์ง์ํํฉ๋๋ค. ๊ฐ์ฅ ํํ ์๋ฒ์ด cron, systemd timer, rc.local, profile ์คํฌ๋ฆฝํธ, LD_PRELOAD์
๋๋ค. ํนํ /etc/ld.so.preload๋ ๋ชจ๋ ๋์ ๋งํฌ ํ๋ก๊ทธ๋จ์ ์๊ธฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ๋ก ๋ผ์๋ฃ๋ ๊ฐ๋ ฅํ ๋ฃจํธํท ๋๊ตฌ์
๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- ์ ๊ท cron/timer ๋ด์ฉ ํ์ธ:
cat,crontab -l -u <user> /etc/ld.so.preload๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ๊ทธ ์์ ๋ช ์๋.soํ์ผ์ด ์ ์์ธ์ง ํ์ธ- ์์ฌ ์คํฌ๋ฆฝํธ๋ฉด ์ฆ์ ๋นํ์ฑํ (
systemctl mask, cron ํญ๋ชฉ ์ ๊ฑฐ) - ๋ณ๊ฒฝ ์๊ฐ๊ณผ 11_login_history ๊ต์ฐจ ํ์ธ โ ๋๊ฐ ์ธ์ ๋ก๊ทธ์ธํ๋์ง
๋ฌด์์ ๋ณด๋์?
- ๋ชจ๋ ์ฌ์ฉ์์
~/.ssh/authorized_keys๊ฐ ์ด์ ์ ๋ค๋ฅธ์ง (์ ๊ท ํค 1์ค์ด๋ผ๋ HIGH) sshd -T๋ก ์ถ์ถํ effective ์ค์ (PermitRootLogin,PasswordAuthentication,AllowUsers,Port๋ฑ)์ด ์ด์ ์ ๋ค๋ฅธ์ง/etc/pam.d/์์ ์ต๊ทผ 24์๊ฐ ๋ด ๋ณ๊ฒฝ๋ ํ์ผ์ด ์๋์ง/etc/securetty๊ฐ ๋ณ๊ฒฝ๋๋์ง
์ ๋ด์ผ ํ๋์?
SSH ํค ์ถ๊ฐ๋ ๊ณต๊ฒฉ์๊ฐ ๊ฐ์ฅ ํํ๊ฒ ์ฐ๋ ์ฌ์ ์ ๋ฐฑ๋์ด์
๋๋ค. ํจ์ค์๋ ๋ณ๊ฒฝ์ ์ด์์์๊ฒ ์ฆ์ ๋คํค์ง๋ง, authorized_keys์ ํค ํ ์ค ์ถ๊ฐ๋ ๊ฑฐ์ ์ ๋คํต๋๋ค. PAM ๋ชจ๋ ๋ณ์กฐ๋ ํจ์ค์๋๋ฅผ ๊ฐ๋ก์ฑ๊ฑฐ๋ ํน์ ์
๋ ฅ์ผ๋ก ์ธ์ฆ์ ์ฐํํ๊ฒ ๋ง๋ญ๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- ์ ๊ท SSH ํค์ comment ํ๋ ํ์ธ (๋ณดํต
user@hostํ์, ๋ฏ์ ํธ์คํธ๋ฉด ์์ฌ) - ํด๋น ์ฌ์ฉ์์
last์ถ๋ ฅ๊ณผ ๊ต์ฐจ โ ์ธ์ ๋ก๊ทธ์ธํ๋์ง - ์ฆ์ ํค ์ ๊ฑฐ + ํด๋น ์ฌ์ฉ์ ํจ์ค์๋ ์ฌ๋ฐ๊ธ
- sshd ์ค์ ๋ณ๊ฒฝ์ด ์ด์ ์๋๊ฐ ์๋๋ฉด ์ฆ์ ์๋ณต
๋ฌด์์ ๋ณด๋์?
WEB_ROOTS๋ก ์ง์ ๋ ๋๋ ํ ๋ฆฌ์ PHP/JSP/ASP ํ์ผ์์ ๋ค์ ํจํด ๋งค์นญ:
eval(base64_decode($_POST[...]))๊ฐ์ ๋๋ ํ๋ ์ฝ๋ ์คํsystem($_GET[...])์ฒ๋ผ ์ฌ์ฉ์ ์ ๋ ฅ์ ๊ทธ๋๋ก ๋ช ๋ น์ผ๋ก ๋๊ธฐ๋ ์ฝ๋Runtime.exec,new ProcessBuilder(JSP)WScript.Shell,Shell.Application(ASP)c99shell,r57shell,FilesMan,wso๊ฐ์ ๊ณต๊ฐ ์น์ ๋งค์ง ๋ฌธ์์ด
์ ๋ด์ผ ํ๋์? WAF๋ HTTP ์์ฒญ์ ๋ณด์ง๋ง, ๊ณต๊ฒฉ์๊ฐ ์ด๋ฏธ ์น์ ์ ๋ก๋์ ์ฑ๊ณตํ ํ์ ๊ทธ ์น์์ด ์ฒ๋ฆฌํ๋ ํธ๋ํฝ์ ์ ์ ์๋ต์ผ๋ก ๋ณด์ ๋๋ค. ๋์คํฌ์ ๋จ์ ํ์ผ์ ์ ๊ธฐ์ ์ผ๋ก ์ค์บํ๋ ๊ฒ ์ฌ์ค์ ์ ์ผํ ์ฌํ ํ์ง ์๋จ์ ๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- ๋งค์นญ ํ์ผ์ ๋ณ๊ฒฝ ์๊ฐ(
stat) ํ์ธ โ ํด๋น ์๊ฐ์ ์น ์ก์ธ์ค ๋ก๊ทธ ๋ถ์ - ์ด๋ค ํ์ด์ง๋ฅผ ํตํด ์ ๋ก๋๋๋์ง ์ถ์ โ ์ทจ์ฝ ํ์ด์ง ํจ์น
- ์น์ ํ์ผ์ ๋ณ๋ ์์น์ ๋ณด์กด ํ ์ญ์ (๋ถ์์ฉ)
- ๊ฐ์ ํจํด ์ถ๊ฐ ๊ฒ์:
grep -r '<๊ณต๊ฒฉ์_id_๋๋_์์>' /var/www/
๋ฌด์์ ๋ณด๋์?
wtmp/btmp/secure(RHEL) ๋๋auth.log(Ubuntu)/messages(๋๋syslog) ํ์ผ์ด:- ์ด์ ๋๋น ์ฌ์ด์ฆ๊ฐ ์ค์ด๋ค์๋์ง (์ ์ ์ด์์์ ๋ก๊ทธ๋ ์ฆ๊ฐ๋ง ํจ)
- ์ฌ๋ณผ๋ฆญ๋งํฌ๋ก ๋ฐ๋์๋์ง
- 0๋ฐ์ดํธ์ธ์ง
journalctl --verify๋ก systemd journal ๋ฌด๊ฒฐ์ฑ ํ์ธchronyc/ntpq๋ก ์์คํ ์๊ฐ์ด NTP ๊ธฐ์ค๊ณผ 1์ด ์ด์ ์ด๊ธ๋ฌ๋์ง
์ ๋ด์ผ ํ๋์? ๊ณต๊ฒฉ์๊ฐ ์นจํด ํ ๊ฐ์ฅ ๋จผ์ ํ๋ ํ์ ์ง์ฐ๊ธฐ๊ฐ ๋ก๊ทธ ์ญ์ /๋ณ์กฐ์ ๋๋ค. ์ ์ ์ด์์์ ๋ก๊ทธ ํ์ผ์ ์ ๋ ์์์ง์ง ์์ผ๋ฏ๋ก(rotation ์งํ 1ํ ์์ธ) ์ฌ์ด์ฆ ๊ฐ์๋ ๊ฒฐ์ ์ ๋จ์์ ๋๋ค. ์๊ฐ์ ๊ฑฐ๊พธ๋ก ๋๋ฆฌ๋ฉด ๋ก๊ทธ์ timestamp ์์ฒด๊ฐ ๋ฌด๋ ฅํ๋๋ฏ๋ก, ์๊ฐ ๋๊ธฐํ ์ ๊ฒ๋ ๊ฐ์ ๋งฅ๋ฝ์์ ์ค์ํฉ๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- ์ฆ์ ๋ฉ๋ชจ๋ฆฌ dump + ๋์คํฌ ์ด๋ฏธ์ง ๋ณด์กด (๋ค๋ฅธ ํ์ ๋ ์ฌ๋ผ์ง๊ธฐ ์ ์)
- ๋ฐฑ์ ๋ณธ ๋ก๊ทธ๊ฐ ์๋ค๋ฉด ๋์กฐ
- ์นจํด ์์ ์ถ์ ์ด๋ ค์ โ ๊ฐ๋ฅํ ๋ชจ๋ ๋ก๊ทธ ์์ค ์ข ํฉ ๋ถ์
- ์๊ฐ์ด ์ด๊ธ๋ฌ๋ค๋ฉด NTP ์ ์ํ + ๋ณ์กฐ ์์ฌ ์๊ฐ ์ถ์
๋ฌด์์ ๋ณด๋์?
lsmod์ถ๋ ฅ์ด ์ด์ ์ ๋ค๋ฅธ์ง. ์ ๊ท ๋ชจ๋์ HIGH, ์ฌ๋ผ์ง ๋ชจ๋์ INFO.
์ ๋ด์ผ ํ๋์? LKM(Loadable Kernel Module) ๋ฃจํธํท์ ์ปค๋ ์์ญ์์ ๋์ํ๋ฏ๋ก ์ฌ์ฉ์ ์์ญ์ ํ์ง๋ฅผ ์ฐํํฉ๋๋ค. ์ ์ ์ด์์์ ์ปค๋ ๋ชจ๋์ด ๊ฐ์๊ธฐ ์ถ๊ฐ๋๋ ์ผ์ ๋๋ฌผ๊ณ (๋๋ถ๋ถ ํจํค์ง ์ ๋ฐ์ดํธ๋ ์ด์์์ ๋ช ์์ ์์ ), ๊ทธ ์ฌ๊ฑด์ ์ด์์๊ฐ ์๊ณ ์์ต๋๋ค. ์ด์์๊ฐ ๋ชจ๋ฅด๋ ์ ๊ท ๋ชจ๋์ ๊ฑฐ์ ํญ์ ์์ฌ์ค๋ฝ์ต๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- ์ ๊ท ๋ชจ๋ ์ ๋ณด ํ์ธ:
modinfo <module> - ์ ์ ํจํค์ง ๋ชจ๋์ธ์ง:
rpm -qf $(modinfo -F filename <module>) - ์์ฌ ๋ชจ๋์ด๋ฉด ์ฆ์ ๊ฒฉ๋ฆฌ (
rmmod์ ๋ฃจํธํท์ด๋ฉด ์ ๋จน์ ์ ์์ โ ์ฌ๋ถํ ๊ฒํ ) /lib/modules/<์ปค๋๋ฒ์ >/์์ ์ ๊ท.koํ์ผ ํ์ธ
๋ฌด์์ ๋ณด๋์?
- RHEL:
rpm -Vaโ ์ค์น๋ ๋ชจ๋ ํจํค์ง์ ๋ชจ๋ ํ์ผ์ ์ ์ ํด์์ ๋น๊ต. checksum/size mismatch๋ง, config/doc/ghost ๋ฑ์ ํํฐ๋ง โ MEDIUM - Ubuntu:
debsums -acโ ์ค์น๋ ๋ชจ๋ ํจํค์ง์ ๋ชจ๋ ํ์ผ(config ํฌํจ) ์ค ๋ณ๊ฒฝ๋ ๊ฒ๋ง ์ถ๋ ฅ โ MEDIUM - ๋ ๊ณ์ด ๊ณตํต์ผ๋ก, ์์คํ
ํต์ฌ ํจํค์ง(
CORE_PKGS_*์ ์ ์๋coreutils,util-linux,openssh-*,pam๋ฑ)๋ ๋ณ๋ ํ ๊ฒ์ฆํด์ mismatch๊ฐ ์์ผ๋ฉด HIGH (์์คํ ๋ช ๋ น ๋ณ์กฐ๋ ๊ฑฐ์ ํ์คํ ์นจํด)
์ด์์๊ฐ ๋ณดํธ ๋์์ ๋ ์ถ๊ฐํ๊ณ ์ถ์ผ๋ฉด secchk.conf์ CORE_PKGS_RHEL / CORE_PKGS_DEBIAN์ ํจํค์ง๋ช
์ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค. ์) curl, sudo, audit ๋ฑ.
์ ๋ด์ผ ํ๋์?
๊ณต๊ฒฉ์๊ฐ ls, ps, ss, sshd ๊ฐ์ ์์คํ
๋ช
๋ น์ด๋ฅผ trojan ๋ฒ์ ์ผ๋ก ๊ต์ฒดํ๋ฉด ์ด์์๊ฐ ๋ณด๋ ๋ชจ๋ ๊ฒฐ๊ณผ๊ฐ ๊ฑฐ์ง์ด ๋ฉ๋๋ค. ๋คํํ ๋ฐฐํฌํ ํจํค์ง์๋ ๋ฉ์ด์ปค๊ฐ ์๋ช
ํ ์ ์ ํด์๊ฐ ๋ค์ด ์์ด, ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณ์กฐ ์ฌ๋ถ๋ฅผ ์ ๋ขฐ์ฑ ์๊ฒ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ฏธ ์นจํด๋ ์๋ฒ์์๋ ๋์ํ๋ ๊ฐ๋ ฅํ ๊ฒ์ฆ๋ฒ์
๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- ๋ณ์กฐ๋ ํ์ผ์ ๋ณ๋ ์์น์ ๋ฐฑ์
- ์ ์ ํจํค์ง ์ฌ์ค์น:
dnf reinstall <pkg>๋๋apt install --reinstall <pkg> - ๋ณ๊ฒฝ ์๊ฐ ํ์ธ โ ์นจํด ์์ ์ถ์
- ์ฌ์ค์น ํ์๋ ๋ค์ ๋ณ์กฐ๋๋ฉด ์ง์์ฑ ๋ฉ์ปค๋์ฆ(15_persistence) ๋ฏธ์ ๊ฑฐ โ ๊ทธ์ชฝ ๊ฒฐ๊ณผ ์ฌํ์ธ
๋ฌด์์ ๋ณด๋์?
/etc/resolv.conf๊ฐ ๋ณ๊ฒฝ๋๋์ง +TRUSTED_DNS์ ์๋ ์ธ๋ถ nameserver๊ฐ ์๋์ง/etc/hosts์ ์ด์ ์๋ ์ธ๋ถ ๋๋ฉ์ธ ๋งคํ์ด ์ถ๊ฐ๋๋์ง/etc/nsswitch.conf๋ณ๊ฒฝ- yum repo / apt sources ํ์ผ ๋ณ๊ฒฝ
- ์ ๋ขฐ CA ์ ์ฅ์(
/etc/pki/ca-trust/source/anchors,/usr/local/share/ca-certificates,/etc/ssl/certs)์ ์ ๊ท ํ์ผ
์ ๋ด์ผ ํ๋์?
๊ณต๊ฒฉ์๊ฐ DNS๋ฅผ ์๊ธฐ ์๋ฒ๋ก ๋๋ฆฌ๋ฉด apt update๋ yum update๊ฐ ์
์ฑ ํจํค์ง๋ฅผ ๋ฐ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. /etc/hosts์ ๊ฐ์ง ๋งคํ์ ์ถ๊ฐํ๋ฉด ์ด์์๊ฐ ์ ๋ขฐํ๋ ๋๋ฉ์ธ์ด ๊ณต๊ฒฉ์ ์๋ฒ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค. ๊ฐ์ง CA๋ฅผ ์ ๋ขฐ ์ ์ฅ์์ ์ฃผ์
ํ๋ฉด SSL ๊ฒ์ฆ์ ์ฐํํ๋ MITM ์ธํ๋ผ๊ฐ ์์ฑ๋ฉ๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- ๋ณ๊ฒฝ ๋ผ์ธ ์ฆ์ ์๋ณต ๋๋ ๊ฒฉ๋ฆฌ
- ๋ณ๊ฒฝ ์๊ฐ์ ๋ก๊ทธ์ธ ์ด๋ ฅ ๊ต์ฐจ ํ์ธ
- ๊ฐ์ง CA๋ฉด ๋ฐ๊ธ์ ์ ๋ณด ํ์ธ:
openssl x509 -in <ca> -text -noout | head -20 - ์์ฌ repo๋ก๋ถํฐ ์ค์น๋ ํจํค์ง๊ฐ ์์ผ๋ฉด ๋ชจ๋ ์ฌ๊ฒ์ฆ
๋ฌด์์ ๋ณด๋์?
postfix/sendmail/mailq๋ช ๋ น์ด ๋ชจ๋ ์์ผ๋ฉด ์๋์ผ๋ก ๊ฑด๋๋- ์์ ๋๋ง: ๋ฉ์ผ ํ ํฌ๊ธฐ๊ฐ ์๊ณ(๊ธฐ๋ณธ 100๊ฑด)๋ฅผ ๋๋์ง
/var/spool/mqueue,/var/spool/postfix/active,/var/spool/postfix/deferred์ ํ์ผ ์ ํญ์ฆ
์ ๋ด์ผ ํ๋์? ๊ณต๊ฒฉ์๊ฐ ์๋ฒ๋ฅผ ์คํธ ๋ฐ์ก ๋ด์ผ๋ก ํ์ฉํ๋ฉด ๋ฉ์ผ ํ์ ๋ฐ์ก ๋๊ธฐ ๋ฉ์ผ์ด ์์ ๋๋ค. ์นจํด๋ ์๋ฒ์์ ํ์์ ๋ค๋ฅธ ๋ฉ์ผ ํธ๋ํฝ์ด ๋ฐ์ํ๋ ๊ฐ์ฅ ํํ ์ ํธ์ ๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
mailq๋ก ํ ๋ด์ฉ ํ์ธ โ ๋ฐ์ ์/์์ ์ ํจํด์ด ๋น์ ์์ธ์ง- ๋น์ ์์ด๋ฉด ๋ฉ์ผ ๋ฐ์ก ์ฆ์ ์ ์ง:
systemctl stop postfix - ๋ฉ์ผ ๋ฐ์ก ํ๋ก์ธ์ค๋ฅผ ๋ง๋ ์ฌ์ฉ์/ํ๋ก์ธ์ค ์ถ์
๋ฌด์์ ๋ณด๋์?
docker/podman๋ช ๋ น์ด ๋ ๋ค ์์ผ๋ฉด ์๋์ผ๋ก ๊ฑด๋๋- ์์ ๋๋ง: ์คํ ์ค ์ปจํ
์ด๋ ์ค์์
Privileged=true๋ก ๋์์ง ๊ฒ (ํธ์คํธ ์ ์ฒด ๊ถํ)/,/etc,/proc,/sys,docker.sock๊ฐ์ ๋ฏผ๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ง์ดํธํ ๊ฒ
์ ๋ด์ผ ํ๋์? Privileged ์ปจํ ์ด๋๋ ํธ์คํธ ๋๋ ํ ๋ฆฌ ๋ง์ดํธ๋ ์ปจํ ์ด๋ escape์ ์งํ ๊ฒฝ๋ก์ ๋๋ค. ์ปจํ ์ด๋ ์์์ root ๊ถํ์ ์ป์ ๊ณต๊ฒฉ์๊ฐ ํธ์คํธ๊น์ง ์ฅ์ ํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ ์ ์ด์์์๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋ ์ค์ ์ ๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- ํด๋น ์ปจํ
์ด๋ ์ฆ์ ์ค์ง:
docker stop <id> - ์ด๋ฏธ์ง ์ถ์ฒ ํ์ธ โ ์ฌ๋ด ์ ๊ท ๋ ์ง์คํธ๋ฆฌ์์ ๋ฐ์ ๊ฒ์ธ๊ฐ?
- ๋ง์ดํธ๋ ํธ์คํธ ๊ฒฝ๋ก์ ๋ณ๊ฒฝ์ด ์๋์ง 14_file_anomaly์ ๊ต์ฐจ
๋ฌด์์ ๋ณด๋์?
clamscan์ด ์ค์น๋ผ ์๊ณ/var/lib/clamav/main.cvd๊ฐ ์๋์ง (์์ผ๋ฉด ERROR)- ์๊ทธ๋์ฒ๊ฐ 30์ผ ์ด์ ์ค๋๋์ผ๋ฉด MEDIUM ๊ฒฝ๊ณ
- ํซ์คํ(๋งค์ผ) + ์ค๋ ์ฝ๋ ์์ญ์ ์ค์บ
- ๊ฐ์ผ ํ์ผ ๋ฐ๊ฒฌ ์ ํ์ผ ๊ฒฝ๋ก + ์๊ทธ๋์ฒ๋ช + sha256 ๊ธฐ๋ก โ HIGH
์ ๋ด์ผ ํ๋์? ์ด ์คํฌ๋ฆฝํธ์ ๋ค๋ฅธ ๋ชจ๋์ "ํ์ ๊ธฐ๋ฐ"(์ด์ ์ ๋ค๋ฅธ ๋ณํ) ๋๋ "ํจํด ๊ธฐ๋ฐ"(์น์ ์ ๊ท์) ๊ฒ์ฌ์ธ๋ฐ, ์ด๋ฏธ ์๋ ค์ง ํธ๋ก์ด์/์/๋ฐฑ๋์ด ๋ณ์ข ์ ์๊ทธ๋์ฒ ๋งค์นญ์ด ๊ฐ์ฅ ๋น ๋ฅด๊ณ ์ ํํฉ๋๋ค. ๋ค๋ฅธ ๊ฒ์ฌ๋ฅผ ๋ณด์ํ๋ ๋ ์ด์ด์ ๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- ๊ฐ์ผ ํ์ผ์ ๊ฒฉ๋ฆฌ: ๋ณ๋ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ + ๊ถํ 600
- ์๊ทธ๋์ฒ๋ช ์ผ๋ก ์ํ ์ ๋ณด ๊ฒ์ (์ธ๋ถ PC์์)
- ๊ฐ์ ์๊ทธ๋์ฒ์ ๋ค๋ฅธ ํ์ผ์ ์ ์ฒด ์ค์บ์ผ๋ก ์ถ๊ฐ ๊ฒ์:
sudo /opt/secchk/secchk.sh --mode full - ๊ฐ์ผ ์๊ฐ์ ์น/SSH ๋ก๊ทธ ๋ถ์ โ ์ด๋ป๊ฒ ๋ค์ด์๋์ง
--no-clamav๋ก ๋๋ ค๋ฉด: cron ๋ผ์ธ์ ์ต์
์ถ๊ฐ.
๋ฌด์์ ๋ณด๋์?
rkhunter --check๊ฒฐ๊ณผ์Warning:๋ผ์ธ์ MEDIUM์ผ๋ก ๋ณด๊ณ
์ ๋ด์ผ ํ๋์? ClamAV์ ๋ค๋ฅธ ์๊ทธ๋์ฒ DB๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ณด์กฐ ๊ฒ์ฆ ๋ ์ด์ด๊ฐ ๋ฉ๋๋ค. ๋จ ๊ฑฐ์ง์์ฑ์ด ๋ง์ ๊ธฐ๋ณธ OFF์ด๋ฉฐ, ์ด์์๊ฐ ํ์ดํธ๋ฆฌ์คํธ ๊ด๋ฆฌ๋ฅผ ๊ฐ๋นํ ์ ์๋ ํ๊ฒฝ์์๋ง ์ผญ๋๋ค.
ํ์ง๋๋ฉด ์ด๋ป๊ฒ ํ๋์?
- Warning ๋ด์ฉ ํ์ธ โ ๊ฑฐ์ง์์ฑ ๊ฐ๋ฅ์ฑ ๊ฒํ
- ์ง์ง ์ํ์ผ๋ก ํ๋จ๋๋ฉด 13_process, 15_persistence์ ๊ต์ฐจ
- ๊ฑฐ์ง์์ฑ์ด๋ฉด
/etc/rkhunter.conf์ ํ์ดํธ๋ฆฌ์คํธ ๋ฑ๋ก
๋ค์์ 12์ข
์ ์นจํด๋ฅผ ๋์์ ์ฌ์ด๋๊ณ ์ ๊ฒ์ ๋๋ฆฐ ๊ฒฐ๊ณผ์
๋๋ค (๊ฒ์ฆ ์๋๋ฆฌ์ค B). ์๋ ์ด๋ฏธ์ง ์ญ์ ์ค์ report.html ์บก์ฒ์
๋๋ค.
์ฌ์ ์นจํด์ ํ์ง๋ ๋ชจ๋:
| ์นจํด | ํ์ง ๋ชจ๋ |
|---|---|
์ ๊ท ์ฌ์ฉ์ ์ถ๊ฐ (useradd hacker_alice) |
10 (critical_file_changed ร 3 + new_account) |
| sudoers NOPASSWD ๋ผ์ธ | 10 (sudoers_changed + new_nopasswd) |
/tmp ์์ฌ ์คํ (.attacker_payload) |
13 (suspicious_exec_location + suspicious_mapping) |
/opt ์ ๊ท SUID (.suid_backdoor) |
14 (new_suid) |
/etc/ld.so.preload ์์ฑ |
15 (ld_preload_file) |
cron.d ์ ๊ท ๋ฐฑ๋์ด |
15 (cron_changed) |
.bashrc์ LD_PRELOAD |
15 (ld_preload_user_shell) |
| ์ ๊ท SSH authorized_key | 16 (new_ssh_key) |
| ๋๋ฏธ ์น์ (eval base64_decode) | 17 (webshell_pattern_match) |
| ๋ก๊ทธ ํ์ผ 0๋ฐ์ดํธ + ์ฌ์ด์ฆ ๊ฐ์ | 18 (log_zero_size ร 2 + log_size_decreased) |
/bin/ls ๋ณ์กฐ |
20 (debsums_mismatch MEDIUM + core_pkg_mismatch HIGH) |
/etc/hosts ์ธ๋ถ ๋งคํ + ๊ฐ์ง CA |
21 (hosts_external_mapping + new_ca_cert) |
โ ์ด HIGH 18 + MEDIUM 6 = STATUS:ALERT. 12์ข ์นจํด๊ฐ 9๊ฐ ๋ชจ๋์์ ๋ชจ๋ ํ์ง๋ฉ๋๋ค.
/opt/secchk/output/
โโโ latest โ 20260530/ โ ๋งค์ผ ๊ฐฑ์ ๋๋ ์ฌ๋ณผ๋ฆญ๋งํฌ
โโโ SUMMARY_INDEX.txt โ ์ผ์๋ณ ํ ์ค ๋์ (output/ ๋ฃจํธ)
โ
โโโ 20260530/ โ ์ค๋ ๋๋ ํ ๋ฆฌ
โโโ SUMMARY.txt โ ํ ์ค ์์ฝ (๊ฐ์ฅ ์์ฃผ ๋ณด๋ ํ์ผ)
โโโ result.json โ JSONL ์์ธ (๋ชจ๋๋ณ ๋ฐ๊ฒฌ ์ ์ฒด)
โโโ report.html โ ๋ธ๋ผ์ฐ์ ์ฉ ์นด๋ํ ๋ฆฌํฌํธ
โโโ full.log โ ์คํ ๋ก๊ทธ
โโโ diff_from_yesterday.txt โ ์ด์ ์ ์ค๋์ ๋ฐ๊ฒฌ ์ฐจ์ด
โโโ .preserved โ HIGH ๋ฐ๊ฒฌ ์ ์๋ ์์ฑ (retention ๋ฉด์ ๋ง์ปค)
โโโ state/ โ ๋ชจ๋๋ณ ๋น๊ต ๊ธฐ์ค (๋ค์๋ ์ฌ์ฉ)
โโโ 10_account/
โโโ 12_network/
โโโ ...
| ํ์ผ | ์ฉ๋ | ๋ณดํธ |
|---|---|---|
SUMMARY.txt |
๋งค์ผ 1๋ถ ์ ๊ฒ ์ ๊ฐ์ฅ ๋จผ์ ๋ณด๋ ํ์ผ | chattr +i ๋ฌด๋จ ์ญ์ ๋ฐฉ์ด |
result.json |
์๋ํ ๋๊ตฌ๋ก ํ์ฑํ๊ฑฐ๋ grep์ผ๋ก ๊ฒ์ | chattr +i |
report.html |
๋ธ๋ผ์ฐ์ ์์ ์๊ฐ์ ์ผ๋ก ํ์ธ. ์ธ๋ถ CSS/JS 0๊ฑด | chattr +i |
full.log |
๋๋ฒ๊น , ๋ชจ๋ ์คํ ์๊ฐ ํ์ธ | chattr +i |
diff_from_yesterday.txt |
์ด์ ์ ๋น๊ตํด ์๋ก ๋ฐ์ํ ๋ฐ๊ฒฌ๋ง ๋น ๋ฅด๊ฒ | chattr +i |
state/ |
๋ค์ ์ ๊ฒ์ ๋น๊ต ๊ธฐ์ค์ด๋ผ ์ ๊ทธ์ง ์์ | (๋น์ ๊ธ) |
{"ts":"2026-05-30T03:30:12+09:00","host":"web01","module":"16_ssh_auth","check":"new_ssh_key","severity":"HIGH","detail":"์ ๊ท SSH authorized_key โ ์ฌ์ ์ ๋ฐฑ๋์ด ์์ฌ","evidence":"root|ssh-rsa AAAA... attacker@evil.com","evidence_sha256":""}KEEP_DAYS(๊ธฐ๋ณธ 30์ผ) ์ด๊ณผ ๋๋ ํ ๋ฆฌ๋ ์๋ ์ญ์ .preservedํ์ผ์ด ์๋ ๋๋ ํ ๋ฆฌ(HIGH ๋ฐ๊ฒฌ ์ผ์)๋ ์๊ตฌ ๋ณด์กด- ์ค๋ ๋๋ ํ ๋ฆฌ๋ ์ ๋ ์ญ์ ๋์ง ์์
์ด ์คํฌ๋ฆฝํธ๋ ์ด์ vs ์ค๋ ๋น๊ต๋ฅผ ํต์ฌ์ผ๋ก ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ฝ๋ ์์ญ์ ์์ผ๋ณ๋ก ํ ๋ฒ์ฉ๋ง ์ ๊ฒ๋๋ฏ๋ก, ์ฒซ ๋น๊ต๊ฐ ๊ฐ๋ฅํ ์์ ์ด ๊ฐ๋ ํ 8์ผ์งธ์ ๋๋ค. ๊ทธ ์ ์ ์๋์ ๋์ฐ๋ฉด ๋จ์ํ "์ฒ์ ๋ณธ ๋ฐ์ดํฐ"๊ฐ ๋ชจ๋ ์ ๊ท๋ก ์กํ ๊ฑฐ์ง์์ฑ์ด ํญ์ฆํฉ๋๋ค.
๊ทธ๋์ ๊ฐ๋ ํ ์ฒซ 8์ผ ๋์์ WARMUP_PERIOD ๋ชจ๋๋ก ๋์ํฉ๋๋ค.
- diff ๊ธฐ๋ฐ ๊ฒ์ฌ (์ด์ ๋น๊ต๊ฐ ํ์ํ ๊ฒ์ฌ)์ HIGH/MEDIUM ๋ฐ๊ฒฌ์ INFO๋ก ๊ฒฉํ
- detail ์์
[warmup]์ ๋์ฌ ํ์ - SUMMARY์
WARMUP_PERIODํ๊ทธ ํ์ - HTML ๋ฆฌํฌํธ ์๋จ์ ์๋ด ๋ฐฐ๋ ํ์
๋น๊ต๊ฐ ํ์ ์๋ ๊ฒ์ฌ (๋จ์ ์กด์ฌ ์ฌ๋ถ, ํ์ผ mtime ๋ฑ)๋ ์ฒซ๋ ๋ถํฐ ์ ์ ๋์ํฉ๋๋ค.
- UID 0 ๋นroot ๊ณ์ , ๋น ํจ์ค์๋ (10)
/etc/ld.so.preload์กด์ฌ (15)- ์์ ๋๋ ํ ๋ฆฌ ์คํ ํ๋ก์ธ์ค (13)
- ๋ก๊ทธ 0๋ฐ์ดํธ/์ฌ๋ณผ๋ฆญ๋งํฌ (18)
- ์น์ ํจํด ๋งค์นญ (17)
- ClamAV ์๊ทธ๋์ฒ ๋งค์นญ (24)
์ฆ, WARMUP_PERIOD ์ค์๋ ๊ฐ์ฅ ๊ฒฐ์ ์ ์ธ ์นจํด ํ์ ์ ๊ทธ๋๋ก ์กํ๋๋ค.
- ์ฒซ 8์ผ ๋์ SUMMARY์
WARMUP_PERIODํ๊ทธ๊ฐ ๋ณด์ด๋ฉด ์ ์ - 8์ผ์ด ์ง๋๋ฉด ์๋์ผ๋ก ์ฌ๋ผ์ง
- 8์ผ์ด ์ง๋ฌ๋๋ฐ ๊ณ์ ๋ณด์ด๋ฉด
output/๋๋ ํ ๋ฆฌ ์ ํ์ธ (ls output/ | grep -c '^20'์ด 8 ์ด์์ด์ด์ผ)
STATUS:WARN(MEDIUM๋ง ๋ฐ๊ฒฌ)์ผ ๋: ์ฆ์ ๊ฒฉ๋ฆฌ ๋จ๊ณ๊น์ง ๊ฐ ์ผ์ ๋๋ฌผ์ง๋ง, ์ด๋ค ๊ฒ์ฌ๊ฐ ์กํ๋์ง ๋ณด๊ณ ์ ์ ๋ณ๊ฒฝ์ธ์ง ํ์ธํฉ๋๋ค.
result.json์์ MEDIUM ํญ๋ชฉ๋ง ์ถ์ถํด ์ด์ํ์ด ์ธ์งํ๋ ๋ณ๊ฒฝ์ธ์ง ํ์ธ โ ๋ชจ๋ฅด๋ ๋ณ๊ฒฝ์ด๋ฉด ์๋ SOP์ ์คํด์ ๋์. ์ต์ํด์ง ๋ฐ๋ณต MEDIUM(์: ์ปจํ ์ด๋ sudoers์ ์ด์์ NOPASSWD ๋ผ์ธ)์ ๋ฌด์ํด๋ ์ข์ต๋๋ค. ๋ค๋ง ๊ฐ์ MEDIUM์ด ๋งค์ผ ๊ณ์ ๋ณด์ด๋ ๊ฒ ์๋๋ผ ์๋ก ์ถ๊ฐ๋ MEDIUM์ด๋ผ๋ฉด ํ ๋ฒ ํ์ธํ๋ ๊ฒ ์์ ํฉ๋๋ค.
ํ์์ผ ์์นจ 9์. ์ด์์๊ฐ ๋งค์ผ ํ๋ ํ ์ค ์ ๊ฒ์ ์คํํ๋ค.
$ ssh web01 'cat /opt/secchk/output/latest/SUMMARY.txt' [2026-05-30 03:30:12] HIGH:2 MEDIUM:3 LOW:0 INFO:6 ERROR:0 ELAPSED:8s STATUS:ALERT HOST:web01 MODE:daily
STATUS:ALERT. ์ด์ ๊น์ง ๋ฉฐ์น ์งธ CLEAN์ด์๋๋ฐ ์ค๋ ์ฒ์ ๋ด๋ค. ์ด์์๋ ๋ค์ ๋ช ๋ น์ผ๋ก ๋ฌด์์ด ์กํ๋์ง ๋ณธ๋ค.$ ssh web01 'cat /opt/secchk/output/latest/diff_from_yesterday.txt' # diff_from_yesterday โ 20260529 vs 20260530 ## "+" ์ค๋ ์ ๋ฐ๊ฒฌ (๊ฐ์ฅ ์ค์): + 16_ssh_auth|HIGH|new_ssh_key|์ ๊ท SSH authorized_key โ ์ฌ์ ์ ๋ฐฑ๋์ด ์์ฌ + 15_persistence|HIGH|ld_preload_file|/etc/ld.so.preload ์กด์ฌ โ ์์คํ ์ ์ญ LD_PRELOAD ๋ฃจํธํท ์์ฌ"์ ๊ท SSH ํค"์ "ld.so.preload"๊ฐ ๋์์. ์ ์ ์ด์์์ ์ด๋ฐ ๋ณ๊ฒฝ์ ํ ์ฌ๋์ด ์๋๋ฐ. ์ด์์๋ ์ฆ์ ๋ค์ SOP๋ฅผ ์์ํ๋ค.
HIGH๊ฐ ๋ด๋ค
โ
โผ
์ด๋ค ๊ฒ์ฌ์ธ๊ฐ? (diff_from_yesterday.txt์ "+" ํญ๋ชฉ)
โ
โโ ์ด์ํ์ด "๋ด๊ฐ ํ ์ผ"์ด๋ผ๊ณ ํ์ธ โ ์ ์ ๋ณ๊ฒฝ
โ โ
โ โผ
โ ์ด์ ๊ธฐ๋ก์ ๋ณด๊ด (๋ค์๋ถํฐ๋ ์ต์ํ ๋ณ๊ฒฝ)
โ
โโ ์๋ฌด๋ ๋ชจ๋ฅธ๋ค โ ์นจํด ๊ฐ๋ฅ์ฑ
โ
โผ
13-3์ 4๋จ๊ณ SOP ์์
# ๊ฒฐ๊ณผ ๋๋ ํ ๋ฆฌ ์ ์ฒด๋ฅผ ๋ณ๋ ์์น์ ๋ณด์กด
sudo tar czf /tmp/secchk-$(hostname)-$(date +%Y%m%d-%H%M).tgz /opt/secchk/output/
# ๊ฐ๋ฅํ๋ฉด USB๋ ๋ค๋ฅธ ์๋ฒ๋ก ์ฆ์ ๋ณต์ฌ (๊ณต๊ฒฉ์๊ฐ ์ถ๊ฐ ์ฒญ์ํ๊ธฐ ์ ์)์ถ๊ฐ ๋ณด์กด:
- ๋ฉ๋ชจ๋ฆฌ dump (๊ฐ๋ฅํ๋ฉด, ๋ณ๋ ๋๊ตฌ ํ์)
- ์์ฌ ํ๋ก์ธ์ค์
/proc/<pid>/exe,/proc/<pid>/maps,/proc/<pid>/cmdline - ํ์ฌ LISTEN ํฌํธ ์ํ:
ss -tnlp > /tmp/ss-snapshot.txt
| ์ํฉ | ํ๋จ |
|---|---|
| HIGH๊ฐ 13_process(๋ฃจํธํท) ๋๋ 15_persistence(ld.so.preload) | ์ฆ์ ๋คํธ์ํฌ ๊ฒฉ๋ฆฌ ๊ฒํ |
| HIGH๊ฐ 16_ssh_auth(์ ๊ท SSH ํค)๋ง ๋จ๋ | SSH ํค ์ฆ์ ์ ๊ฑฐ + ์ฌ์ฉ์ ํจ์ค์๋ ์ฌ๋ฐ๊ธ, ๊ฒฉ๋ฆฌ๋ ์ถ๊ฐ ์ ํธ ๋ณด๊ณ ๊ฒฐ์ |
| HIGH๊ฐ 17_webshell | ์น ์๋น์ค ์ผ์ ์ค์ง + ์น์ ํ์ผ ๊ฒฉ๋ฆฌ, ๋ฐฑ์๋๋ ์ ์ง |
| HIGH๊ฐ 21_network_config(DNS/CA ๋ณ์กฐ) | ์ฆ์ ๊ฒฉ๋ฆฌ, MITM ์ธํ๋ผ ์์ฑ๋์ ๊ฐ๋ฅ์ฑ |
- ๋ณด์ํ, ์ด์ํ, ์ฑ ์์ (์ฌ๋ด ๋ณด์์ฌ๊ณ ๋ณด๊ณ ์ฒด๊ณ์ ๋ฐ๋ผ)
- ๋ณด๊ณ ์ ํฌํจํ ์ ๋ณด:
- ํธ์คํธ๋ช , ๋ฐ๊ฒฌ ์๊ฐ, ์ ๊ฒ ์๊ฐ
- HIGH ํญ๋ชฉ ๋ชฉ๋ก (
grep '"severity":"HIGH"' result.json) - ๋ณด์กดํ ์ฆ๊ฑฐ ํ์ผ ์์น
- ์ถ์ ์นจํด ์์ (๊ด๋ จ ํ์ผ์ mtime)
secchk ์ ๋ฒ์ ๋ฐ. ์ฌ๋ด ๋ณด์ํ ๋๋ ์ธ๋ถ ์ ๋ฌธ ์ธ๋ ฅ์ ์ธ๊ณ.
์ด ์คํฌ๋ฆฝํธ๋ ๋ฐ๊ฒฌํ ์นจํด ํ์ ์ ์๋์ผ๋ก ์ ๊ฑฐํ์ง ์์ต๋๋ค. ๋ค์ ์ด์ ๋๋ฌธ์ ๋๋ค.
- ์๋ ์ ๊ฑฐ๋ ์ฆ๊ฑฐ๋ฅผ ๊ฐ์ด ์์ฑ๋๋ค. ์นจํด ์์ ์ถ์ , ์นจํฌ ๊ฒฝ๋ก ๋ถ์์ด ๋ถ๊ฐ๋ฅํด์ง๋๋ค.
- ๊ณต๊ฒฉ์์ ๋ค๋ฅธ ์์กด ๋ฐฑ๋์ด๋ฅผ ๋์น๊ฒ ๋ฉ๋๋ค.
- ์๋ ์ ๊ฑฐ ์์ฒด๊ฐ ์ด์ ์ฅ์ ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค (์ ์ ๋ณ๊ฒฝ์ด์๋ค๋ฉด).
๋ณต๊ตฌ๋ ์ฌ๋์ด ์ฆ๊ฑฐ๋ฅผ ๋ณธ ํ ํ๋จํ๋ ์ ์ฐจ์ฌ์ผ ํฉ๋๋ค.
8. ClamAV ์๊ทธ๋์ฒ USB ๋ฐ์
์ ์ฐจ ์ฐธ์กฐ. ์ธ๋ถ ์ธํฐ๋ท์ด ๊ฐ๋ฅํ PC์์ freshclam ๋ช
๋ น์ผ๋ก ๋ฐ์ USB๋ก ๋ฐ์
ํฉ๋๋ค.
output/ ๋๋ ํ ๋ฆฌ ์๊ฐ 8๊ฐ ๋ฏธ๋ง์ด๋ฉด WARMUP์ด ์ ์ง๋ฉ๋๋ค.
ls /opt/secchk/output/ | grep -c '^20'8 ์ด์์ด์ด์ผ ์ ์ ๋ชจ๋ ์ง์
. ๋ง์ฝ ๋๋ ํ ๋ฆฌ๊ฐ ์ถฉ๋ถํ๋ฐ๋ WARMUP์ด ๋จ๋ฉด retention ์ ์ฑ
์ผ๋ก ์ญ์ ๋์ ๊ฐ๋ฅ์ฑ (KEEP_DAYS ํ์ธ).
์ด์ ํ๊ฒฝ๋ง๋ค ์ ์ ํญ๋ชฉ์ด ๋ค๋ฅด๋ฏ๋ก ์ฒซ 1~2์ฃผ๋ ์ ๋น ๊ธฐ๊ฐ์ ๋๋ค.
- ์ ์ ์ ๊ท LISTEN ํฌํธ๊ฐ ์๋ค๋ฉด: ์ด์ ๊ธฐ๋ก์ ๋จ๊ธฐ๊ณ , ์ถํ ์๋์ด ์๋ฏธ ์๋์ง ๊ฒํ
/etc/sudoers๊ฐ ๋งค๋ฒ ์กํ: ์ด์์๊ฐ ์์ ํ ํ์ . ์ ์์ด๋ฉด ๋ฌด์ (๋ฐ๋ณต ์๋์ด์ง๋ง ์นจํด๋ ์๋)- ๋ณดํต 1์ฃผ์ฐจ์ ์ต์ํด์ง๋ฉด ๊ฑฐ์ง์์ฑ ํจํด์ด ์์ ํ๋จ
secchk: ๋์คํฌ ์ฌ์ ๋ถ์กฑ (512MB < 1024MB), /opt/secchk โ ์ค๋จ
MIN_FREE_MB ๋ฏธ๋ง์ด๋ฉด ์ ๊ฒ์ ์์ํ์ง ์์ต๋๋ค(์ ๊ฒ ๊ฒฐ๊ณผ๋ก ๋์คํฌ๊ฐ ๊ฐ๋ ์ฐจ๋ ์ฌ๊ณ ๋ฐฉ์ง). ๋ค์ ์ค ํ๋๋ก ๋์:
- ๋์คํฌ ์ ๋ฆฌ (ํนํ
/var/log์output/์์ ์ค๋๋ ALERT ๋๋ ํ ๋ฆฌ) secchk.conf์์KEEP_DAYS๋ฅผ ์ค์ฌ ์๋ ์ ๋ฆฌ๋ ๋๋ฆฌ๊ธฐMIN_FREE_MB๋ฅผ ๋ฎ์ถ๊ธฐ (์ํ. ๋ณดํธ ์๋ ์ฝํ)
๋ค์ ๋ถํ ์ ์ด๊ฐ ์ด๋ฏธ ์ ์ฉ๋์ด ์ํฅ์ ์ต์ํํฉ๋๋ค.
nice -n 19 ionice -c3 idleโ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์๋ณดulimit -v 1500000โ ๋ฉ๋ชจ๋ฆฌ 1.5GB ์ํ (ClamAV ๋ณดํธ)--throttle 0.1โ ๊ฒ์ฌ ์ฌ์ด 0.1์ด sleep- ํซ์คํ ๋งค์ผ + ์ฝ๋ ์์ผ๋ณ ๋ถํ โ ๋์คํฌ ์ ๊ฒ ๋ถํ 1/7๋ก ๋ถ์ฐ
- ๋ชจ๋๋ณ
timeout 60s, ClamAVtimeout 3600sโ hang ๋ฐฉ์ง
์๋ฒฝ ์๊ฐ๋(03:30) ์คํ์ ๊ถ์ฅํฉ๋๋ค.
๊ฐ์ ํธ์คํธ์์ ๋์ ์คํ์ flock์ผ๋ก 1๊ฐ๋ก ์ ํ๋ฉ๋๋ค (exit 30). ์ด์ ์คํ์ด ๋๋์ง ์์ ์ํ์์ ์ cron์ด ๋๋ฉด ์ ์ธ์คํด์ค๊ฐ ์ฆ์ ์ข
๋ฃ๋ฉ๋๋ค. ์ ์ ๋์์
๋๋ค.
cron ๋ผ์ธ์ --no-clamav ์ต์
์ถ๊ฐ.
30 3 * * * root /opt/secchk/secchk.sh --mode daily --no-clamav >/dev/null 2>&1๋ค๋ฅธ 16๊ฐ ๋ชจ๋์ ๊ทธ๋๋ก ๋์ํฉ๋๋ค.
secchk.conf์ ROTATE_<์์ผ> ๋ถ๋ฐฐ๋ฅผ ์์ ๋กญ๊ฒ ์กฐ์ ํ์ธ์. ์๋ฅผ ๋ค์ด ์ผ์์ผ์ /var/lib์ด ํฌ๋ฉด ํ ์์ผ๊ณผ ๋๋๊ฑฐ๋ ํ์ผ๋ก ์ฎ๊ธฐ๋ฉด ๋ฉ๋๋ค.
์์ต๋๋ค. ๋ชจ๋ CSS๋ ์ธ๋ผ์ธ์ด๋ฉฐ JavaScript๋ ์์ต๋๋ค. ์คํ๋ผ์ธ ํ๊ฒฝ์์๋ ๊ทธ๋๋ก ์ด๋ฆฝ๋๋ค.
| ํ๊ณ | ๋ณด์ ๋ฐฉ๋ฒ (๊ฐ๋ต) |
|---|---|
| ๋งค์ผ 1ํ ์ ๊ฒ์ด๋ผ ๊ทธ ์ฌ์ด ๋ฐ์ํ๋ค๊ฐ ์ฌ๋ผ์ง ์งง์ ๊ณต๊ฒฉ์ ๋์นจ | cron ์ฃผ๊ธฐ๋ฅผ ์๊ฐ ๋จ์๋ก ์ขํ๊ฑฐ๋, ์ ๊ฒ ์๊ฐ์ ๋ฌด์์ ์ง์ฐ (sleep $((RANDOM%600)))์ผ๋ก ๊ณต๊ฒฉ์์ ์๊ฐ ์์ธก ์ด๋ ต๊ฒ |
| ๊ด๋ฆฌ์ ๊ถํ ๊ณต๊ฒฉ์๋ ์ ๊ฒ ๊ฒฐ๊ณผ ์์ฒด๋ฅผ ์์กฐํ ์ ์์ | chattr +i๋ก ์ผ๋ถ ์ง์ฐ ํจ๊ณผ. ์์ ๋ณดํธ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๋ ์์คํ
์ผ๋ก ์ธ๋ถ ์ ๋ฌํด์ผ ๊ฐ๋ฅ (secchk ๋ฒ์ ๋ฐ) |
| ์๋ ค์ง ์ ์ฑ์ฝ๋ ์๊ทธ๋์ฒ ๊ฐฑ์ ์ด USB ๋ฐ์ ์ฃผ๊ธฐ๋งํผ ๋ฆ์ | ์๊ทธ๋์ฒ 30์ผ ์ด๊ณผ ์ ์๋ MEDIUM ๊ฒฝ๊ณ ํ์. ์ด์์๊ฐ ๋ฐ์ ์ฃผ๊ธฐ๋ฅผ ๋จ์ถ |
| ์นจํด๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ณด๊ณ ๋ง ํจ | HIGH ๋ฐ๊ฒฌ ์ ์ด์์๊ฐ SOP์ ๋ฐ๋ผ ์๋ ๋์ (13. HIGH ๋ฐ๊ฒฌ ์ ๋์) |
| ๊ณต๊ฒฉ์๊ฐ ์ ๊ฒ ์๊ฐ์ ์๋ฉด ์ ์ ๋ณต์ โ ์ ๊ฒ ํต๊ณผ โ ์ฌ์นจํด ๊ฐ๋ฅ | /etc/cron.d/secchk ๊ถํ์ 600์ผ๋ก ์ ํ + ์ ๊ฒ ์๊ฐ์ ๋ฌด์์ ์ง์ฐ |
| ์ ์ข /๋ง์ถค ์ ์ฑ์ฝ๋๋ ์๊ทธ๋์ฒ๊ฐ ์์ด ๋ชป ์ก์ | ์ด ์คํฌ๋ฆฝํธ์ ํ์ ๊ธฐ๋ฐ ๊ฒ์ฌ(13/15/14)๊ฐ ๋ณด๊ฐ. ์๊ทธ๋์ฒ ์์กด ์์ญ์ ClamAV 1๊ฐ ๋ชจ๋๋ก ํ์ |
์ด ์คํฌ๋ฆฝํธ๋ ์ ํ๊ณ๋ฅผ ์๊ณ ์๋ ์ ๊ธฐ ์ ๊ฒ ๋๊ตฌ์ ๋๋ค. ํ๊ณ๋ฅผ ์ธ์งํ๊ณ ์ด์ํ๋ฉด ์ถฉ๋ถํ ์ค์ฉ์ ์ธ ๊ฐ์์ฑ์ ์ ๊ณตํฉ๋๋ค.
linux_sec/
โโโ build.sh โ src/*.sh ๋ฅผ ๋ฒํธ ์์๋ก cat โ secchk.sh ์์ฑ
โโโ secchk.sh โ ๋ฐฐํฌ ์ฐ์ถ๋ฌผ (build.sh ๊ฐ ์์ฑ, git ์๋ ์ปค๋ฐ)
โโโ src/
โ โโโ 00_header.sh โ ์ ์ญ ๋ณ์, PATH/alias ๊ฐ์ ์ด๊ธฐํ
โ โโโ 01_args.sh โ ์ธ์ ํ์ฑ
โ โโโ 02_common.sh โ ๋ก๊น
/JSON/throttle/state/๋ชจ๋ ๊ฒฉ๋ฆฌ ํฌํผ
โ โโโ 03_os_detect.sh โ OS ์๋ ๊ฐ์ง + ์ค์ ๋ก๋
โ โโโ 04_lock_resource.sh โ flock/nice/ionice/ulimit/๋์คํฌ ๊ฒ์ฌ/์ถ๋ ฅ ์ค๋น
โ โโโ 10_account.sh ~ 25_rkhunter.sh โ ์ ๊ฒ ๋ชจ๋ 16๊ฐ
โ โโโ 89_dispatch.sh โ ๋ชจ๋๋ณ ๋ชจ๋ ํธ์ถ (run_checks)
โ โโโ 90_report.sh โ SUMMARY/HTML/diff/latest/chattr/retention
โ โโโ 99_footer.sh โ main() ์ง์
์ + ์ข
๋ฃ ์ฝ๋
./build.sh๋ค์์ ์๋ ์ํ:
src/[0-9][0-9]_*.sh๋ฅผ ๋ฒํธ ์์๋๋ก ์ฝ์00_header.sh์ shebang๋ง ์ ์งํ๊ณ ๋๋จธ์ง ๋ชจ๋์ shebang ์ ๊ฑฐ- ํ๋์
secchk.sh๋ก ํฉ์นจ bash -n์ผ๋ก ๋ฌธ๋ฒ ๊ฒ์ฌshellcheck๊ฐ ์ค์น๋ผ ์์ผ๋ฉด ์ ์ ๋ถ์
src/26_my_check.sh์์ฑmod_26_my_check()ํจ์ ์ ์ (๋ง์ง๋ง์return 0๋ช ์)src/89_dispatch.sh์run_checks()์_run_if_defined mod_26_my_check '26_my_check'์ถ๊ฐ./build.sh์คํ
๊ฐ ๋ชจ๋์ ๋ค์ ํฌํผ๋ฅผ ์์ ๋กญ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ:
log_finding <module> <check> <severity> <detail> [evidence] [diff_based]state_save <module> <key>(stdin โ ์ค๋ state ํ์ผ)state_yesterday_path <module> <key>(์ด์ state ๊ฒฝ๋ก)is_private_ip <ip>(RFC1918 + ๋ฃจํ๋ฐฑ)have_cmd <๋ช ๋ น>mk_tmp(cleanup ์๋ ์ถ์ )throttle_sleep
sudo apt install -y shellcheck # ๋๋ dnf install -y ShellCheck
./build.sh # ๋น๋ ๋ง์ง๋ง ๋จ๊ณ์์ shellcheck ์๋ ์คํ./build.sh
sudo ./secchk.sh --mode dailyexit 1 (HIGH ๋ฐ๊ฒฌ ์) ๋๋ 0 (CLEAN) ๋๋ 2 (MEDIUM๋ง)๊ฐ ์ ์.
| ์ต์ | ์ธ์ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|---|
--os |
auto | rhel | debian |
auto |
OS ๊ณ์ด ์ง์ . auto ๋ /etc/os-release ๋ก ๊ฐ์ง. ๊ฐ์ง ์คํจ ์ ์๋ ์ง์ |
--mode |
daily | full |
daily |
์ ๊ฒ ๋ฒ์. full ์ ์ฝ๋ ์์ญ ์ ์ฒด (์๋ ์ ๊ฒ ์) |
--throttle |
์ซ์(์ด) | 0.1 |
์ ๊ฒ ํญ๋ชฉ ์ฌ์ด sleep. 0 ์ผ๋ก ๋๊ฑฐ๋ 0.2 ๋ก ๋ ๋ถ์ฐ |
--no-clamav |
(๋ถ๋ฆฌ์ธ ํ๋๊ทธ) | OFF | ClamAV ์ ๊ฒ ๋นํ์ฑ (๊ธฐ๋ณธ์ ํ์ฑ) |
--with-rkhunter |
(๋ถ๋ฆฌ์ธ ํ๋๊ทธ) | OFF | rkhunter ์ ๊ฒ ํ์ฑ (๊ธฐ๋ณธ์ ๋นํ์ฑ) |
--rotate-day |
auto | mon..sun |
auto |
์ฝ๋ ์์ญ ์์ผ ๊ฐ์ . auto ๋ ์ค๋ ์์ผ |
--config |
๊ฒฝ๋ก | (์๋ ํ์) | ์ค์ ํ์ผ ๊ฒฝ๋ก ๋ช
์. ์์ผ๋ฉด /etc/secchk.conf โ ์คํฌ๋ฆฝํธ ๋๋ ํ ๋ฆฌ โ ๋ด์ฅ ๊ธฐ๋ณธ๊ฐ ์์ผ๋ก ํ์ |
-h, --help |
โ | โ | ๋์๋ง ์ถ๋ ฅ ํ ์ข ๋ฃ |
-V, --version |
โ | โ | ๋ฒ์ ์ถ๋ ฅ ํ ์ข ๋ฃ |
| ์ฝ๋ | ์๋ฏธ | cron ๋์ |
|---|---|---|
0 |
CLEAN โ HIGH ์ MEDIUM ๋ชจ๋ 0 |
์ ์ |
1 |
ALERT โ HIGH 1๊ฑด ์ด์ |
์ ์ (์ด์์๊ฐ ์ฆ์ ํ์ธ) |
2 |
WARN โ MEDIUM ๋ง (HIGH ๋ 0) |
์ ์ (์ด์์ ๊ฒํ ๊ถ์ฅ) |
10 |
๋ชจ๋ ์คํ ์คํจ (timeout, command not found ๋ฑ ์ธํ๋ผ ๋ฌธ์ ) | ์ ์ (๊ฐ์์ฑ ๋ชฉ์ ) |
20 |
์ค์ ์ค๋ฅ (์ธ์ ์ค๋ฅ, conf ํ์ฑ ์คํจ, ๋์คํฌ ๋ถ์กฑ) | ์ด์์ ์์ ํ์ |
30 |
lock ํ๋ ์คํจ (์ด์ ์ธ์คํด์ค ์งํ ์ค) | ์ ์ (๋ค์ cron ์์ ์ฌ์๋) |
๋ฐฐํฌ ์ ์ด์์๊ฐ ์๋ฒ์ ๋๋ ํ์ผ๋ค:
/opt/secchk/
โโโ secchk.sh (์คํ๊ถํ 700, root:root)
โโโ patterns/
โโโ webshell_regex.txt (์คํฌ๋ฆฝํธ ๋ด์ฅ ํจํด)
โโโ custom_iocs/ (์ด์์ ์์จ, ๋น์ด๋ OK)
/etc/secchk.conf (๊ถํ 600, root:root)
/etc/cron.d/secchk (๊ถํ 600, root:root)
/var/lib/clamav/main.cvd (ClamAV ์ฌ์ฉ ์)
/var/lib/clamav/daily.cvd
/var/lib/clamav/bytecode.cvd
/var/run/secchk.lock (์๋ ์์ฑ, flock ์ฉ)
์ด์ ์ ์๋ ์์ฑ๋๋ ๊ฒฐ๊ณผ:
/opt/secchk/output/
โโโ latest โ 20260530/ (์ฌ๋ณผ๋ฆญ๋งํฌ)
โโโ SUMMARY_INDEX.txt
โโโ YYYYMMDD/ (์ผ์๋ณ ๋๋ ํ ๋ฆฌ)
โโโ SUMMARY.txt
โโโ result.json
โโโ report.html
โโโ full.log
โโโ diff_from_yesterday.txt
โโโ .preserved (HIGH ๋ฐ๊ฒฌ ์ ์๋ ์์ฑ)
โโโ state/ (๋ค์ ์ ๊ฒ ๋น๊ต ๊ธฐ์ค)
๋ณธ README์ ์ฝ๋์ ๋ฑ์ฅํ๋ ๋ณด์ ์ฉ์ด๋ค์ ๊ฐ๋จํ ์ ๋ฆฌํฉ๋๋ค.
| ์ฉ์ด | ์ค๋ช |
|---|---|
| SUID (Set-User-ID) | ํ์ผ์ ๋ถ์ฌํ๋ ํน์ ๊ถํ. ์ผ๋ฐ ์ฌ์ฉ์๊ฐ ์คํํด๋ ํ์ผ ์์ ์(๋ณดํต root) ๊ถํ์ผ๋ก ์คํ๋ฉ๋๋ค. ๊ณต๊ฒฉ์๊ฐ ์๊ธฐ ๋ฐฑ๋์ด์ SUID๋ฅผ ๋ถ์ด๋ฉด ๊ถํ ์์น ํต๋ก๊ฐ ๋ฉ๋๋ค. |
| LKM ๋ฃจํธํท (Loadable Kernel Module rootkit) | ์ปค๋์ ๋ก๋๋์ด ๋์ํ๋ ์
์ฑ ๋ชจ๋. ์ฌ์ฉ์ ์์ญ(ps, ls ๋ฑ)์์๋ ์๊ธฐ ํ์ ์ ์จ๊ธธ ์ ์์ด ํ์ง๊ฐ ์ด๋ ต์ต๋๋ค. |
| C2 (Command and Control) | ๊ณต๊ฒฉ์์ ๋ช ๋ น ์ ์ด ์๋ฒ. ์นจํด๋ ์๋ฒ๊ฐ ์ ๊ธฐ์ ์ผ๋ก ์ ์ํด ๋ช ๋ น์ ๋ฐ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๋๋ค. |
| ๋ฐฑ๋์ด | ์ ์ ์ธ์ฆ ์ ์ฐจ๋ฅผ ์ฐํํด ์์คํ ์ ์ ๊ทผํ ์ ์๋ ์จ๊ฒจ์ง ํต๋ก. ์ ์ฌ์ฉ์ ๊ณ์ , SSH ํค, LISTEN ํฌํธ, ๋ณ์กฐ๋ sshd ๋ฑ ๋ค์ํ ํํ. |
| ์ง์์ฑ (Persistence) | ์ฌ๋ถํ ์ด๋ ํ๋ก์ธ์ค ์ข ๋ฃ ํ์๋ ๋ฐฑ๋์ด๊ฐ ๋ค์ ์คํ๋๊ฒ ๋ง๋๋ ๋ฉ์ปค๋์ฆ. cron, systemd timer, rc.local, ld.so.preload ๋ฑ. |
| MITM (Man-In-The-Middle) | ๋ ํต์ ๋น์ฌ์ ์ฌ์ด์ ๊ณต๊ฒฉ์๊ฐ ๋ผ์ด๋ค์ด ํธ๋ํฝ์ ๊ฐ๋ก์ฑ๋ ๊ณต๊ฒฉ. ๊ฐ์ง CA ์ฃผ์
, DNS ํ์ด์ฌํน, /etc/hosts ์์ฅ ๋ฑ์ด ์ธํ๋ผ๊ฐ ๋ฉ๋๋ค. |
| sudoers | sudo ๋ช
๋ น์ ๊ถํ ์ค์ ํ์ผ. NOPASSWD ์ต์
์ ํจ์ค์๋ ์์ด sudo ์ฌ์ฉ์ ํ์ฉ โ ๊ณต๊ฒฉ์๊ฐ ์์ฃผ ์ถ๊ฐํ๋ ๋ฐฑ๋์ด. |
| PAM (Pluggable Authentication Modules) | Linux ์ธ์ฆ ํ๋ ์์ํฌ. ๋ณ์กฐ๋๋ฉด ํจ์ค์๋ ๊ฐ๋ก์ฑ๊ธฐ, ์ธ์ฆ ์ฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. |
| LD_PRELOAD | ๋์ ๋งํฌ ํ๋ก๊ทธ๋จ ์คํ ์ ์ฐ์ ๋ก๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์ ํ๊ฒฝ๋ณ์. ๋ชจ๋ ํ๋ก๊ทธ๋จ์ ์ ์ฑ ํจ์๋ฅผ ์ฃผ์ ํ ์ ์๋ ๊ฐ๋ ฅํ ๋ฃจํธํท ๋๊ตฌ. |
| Bind shell | ๊ณต๊ฒฉ์๊ฐ ์๋ฒ์ ๋์๋ LISTEN ํฌํธ๋ก ๋ค์ด์์ ๋ช ๋ น์ ์คํํ๋ ๋ฐฑ๋์ด. |
| Reverse shell | ์นจํด๋ ์๋ฒ๊ฐ ๊ณต๊ฒฉ์ ์๋ฒ๋ก ์ ๊ธฐ ์ฐ๊ฒฐ์ ๋ง๋ค์ด ๋ช ๋ น์ ๋ฐ๋ ๋ฐฑ๋์ด. ๋ฐฉํ๋ฒฝ์ outbound ํต์ ๊ฐ ์ฝํ๋ฉด ํต๊ณผ. |
| ์น์ | ์น ์๋ฒ์ ์ ๋ก๋๋ PHP/JSP/ASP ํ์ผ๋ก, HTTP ์์ฒญ์ ํตํด ์๋ฒ ๋ช ๋ น์ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฐฑ๋์ด. |
| EICAR | ์ํฐ๋ฐ์ด๋ฌ์ค ํ
์คํธ์ฉ ํ์ค ๋๋ฏธ ํ์ผ. ์ค์ ์
์ฑ ๊ธฐ๋ฅ์ ์์ง๋ง ๋ชจ๋ AV๊ฐ ์ด๋ฅผ ํ์งํ๋๋ก ์ฝ์๋์ด ์์ด ๊ฒ์ฆ์ ์ฌ์ฉ. ClamAV ๋์
ํ 24 ๋ชจ๋์ด ์ ์ ๋์ํ๋์ง ํ์ธํ๋ ค๋ฉด /tmp ์ EICAR ๋ฌธ์์ด์ ํ ์ค ์ ์ฅํ๊ณ ์ ๊ฒ์ ๋๋ฆฌ๋ฉด ๋ฉ๋๋ค. |
| WARMUP_PERIOD | secchk ์ ๊ฐ๋ ์ด๊ธฐ ์์ ํ ๊ธฐ๊ฐ (8์ผ). ์ด์ vs ์ค๋ ๋น๊ต๊ฐ ์๋ฏธ ์์ด์ง๊ธฐ ์ ๊น์ง ์ผ๋ถ ๊ฒ์ฌ๋ฅผ ๊ฒฉํํด ๊ฑฐ์ง์์ฑ์ ๋ฐฉ์ง. |
| ํซ์คํ / ์ฝ๋ ์์ญ | ๋์คํฌ ์ ๊ฒ ๋์์ ๋ถ๋ฅ. ํซ์คํ(๊ณต๊ฒฉ ํ์ , ๋ณ๋ ์ฆ์)์ ๋งค์ผ, ์ฝ๋ ์์ญ(์์คํ ๋๋ ํ ๋ฆฌ)์ ์์ผ๋ณ 1/7์ฉ. |
| chattr +i | ext ํ์ผ์์คํ ์ immutable ์์ฑ. ์ค์ ๋ ํ์ผ์ root ๊ถํ์ด์ด๋ ์ญ์ /์์ ์ด ๊ฑฐ๋ถ๋ฉ๋๋ค. secchk ๋ ๊ฒฐ๊ณผ ํ์ผ์ ๋ณดํธํ๋ ๋ฐ ์ฌ์ฉ. |
๋ฌธ์ ๋. ์ถ๊ฐ ์ง๋ฌธ์ด๋ ๊ฐ์ ์ ์์ ์ฝ๋ ์ฃผ์์ ํจ๊ป ์ฐธ์กฐํด์ฃผ์ธ์.


