๐Ÿงฐ rpm -Vac๋กœ ๋ฐ”๋€ ์„ค์ •๋งŒ ๋ฝ‘๊ธฐ: ๊ฒฐ๊ณผ 0๊ฑด์ด cannot open Packages database์ผ ๋•Œ

@leekh8 ยท September 14, 2026 ยท 8 min read

Linux ์‹œ์Šคํ…œ ๊ธฐ์ดˆ ์‹œ๋ฆฌ์ฆˆ

๋ช‡ ๋…„ ๊ตด๋ฆฐ ์„œ๋ฒ„๋ฅผ ์ƒˆ ์žฅ๋น„๋กœ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค. ๋„˜๊ธธ ๊ฒƒ์€ "์ด ์„œ๋ฒ„์˜ /etc" ์ „์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทธ๋™์•ˆ ์‚ฌ๋žŒ์ด ๊ธฐ๋ณธ๊ฐ’์—์„œ ๋ฐ”๊พผ ๊ฒƒ๋ฟ์ด๋‹ค. ์ƒˆ ํ™˜๊ฒฝ์€ ์–ด์ฐจํ”ผ ๊ธฐ๋ณธ ์ƒํƒœ๋กœ ์‹œ์ž‘ํ•˜๋‹ˆ๊นŒ.

๋ฌธ์ œ๋Š” ๊ทธ ๋ชฉ๋ก์„ ์•„๋ฌด๋„ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์„ค์น˜๋Š” 3๋…„ ์ „์ด๊ณ  ๊ทธ์‚ฌ์ด ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ์†๋Œ”๋‹ค.

/etc๋ฅผ ํ†ต์งธ๋กœ tar๋กœ ๋ง์•„ ์˜ฎ๊ธฐ๋Š” ์„ ํƒ์ง€๋Š” ์žˆ์ง€๋งŒ, ๊ทธ๊ฑด ์ด๊ด€์ด ์•„๋‹ˆ๋ผ ๋ณต์ œ๋‹ค. ๋‚ก์€ ์„ค์ •๊ณผ ๋งŒ๋ฃŒ๋œ ์ธ์ฆ์„œ์™€ ์ง€๊ธˆ์€ ์“ฐ์ง€ ์•Š๋Š” ์„œ๋น„์Šค ์กฐ๊ฐ์ด ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ„๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ์€ ์ฐจ์ด ๋ชฉ๋ก์ด๋‹ค.

์•ž ๊ธ€์—์„œ rpm ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ํŒจ์น˜ ์ด๋ ฅ์„ ์ฝ์—ˆ๋‹ค. ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ด ๋ฌธ์ œ๋„ ํ‘ผ๋‹ค. RPM์€ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๊ฐ ํŒŒ์ผ์˜ ์ฒดํฌ์„ฌ, ํฌ๊ธฐ, ๊ถŒํ•œ, mtime์„ ๊ธฐ๋กํ•ด ๋‘”๋‹ค. ์ง€๊ธˆ ์ƒํƒœ๋ฅผ ๊ทธ ๊ธฐ๋ก๊ณผ ๋งž์ถฐ ๋ณด๋ฉด ๋ฐ”๋€ ๊ฒƒ๋งŒ ๋‚จ๋Š”๋‹ค.

๋ฐ”๋€ ์„ค์ • ํŒŒ์ผ๋งŒ ๋ฝ‘๋Š”๋‹ค

$ sudo rpm -Vac
S.5....T.  c /etc/ssh/sshd_config
.M.......  c /etc/sudoers.d/local
S.5....T.  c /etc/security/faillock.conf

-V๊ฐ€ ๊ฒ€์ฆ(verify), -a๊ฐ€ ์ „์ฒด ํŒจํ‚ค์ง€, -c๊ฐ€ config๋กœ ํ‘œ์‹œ๋œ ํŒŒ์ผ๋งŒ์ด๋‹ค. ์ถœ๋ ฅ์ด ๋‚˜์˜จ ํŒŒ์ผ์ด ๊ณง ๊ธฐ๋ณธ๊ฐ’์—์„œ ๋ฒ—์–ด๋‚œ ํŒŒ์ผ์ด๋‹ค.

์™ผ์ชฝ ์•„ํ™‰ ๊ธ€์ž๊ฐ€ ๋ฌด์—‡์ด ๋‹ฌ๋ผ์กŒ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

S.5....T.  c /etc/security/faillock.conf
 โ”‚โ”‚    โ”‚
 โ”‚โ”‚    โ””โ”€ T = mtime ๋ณ€๊ฒฝ
 โ”‚โ””โ”€โ”€โ”€โ”€โ”€โ”€ 5 = ๋‚ด์šฉ(์ฒดํฌ์„ฌ) ๋ณ€๊ฒฝ   <<< ์ด๊ฒƒ๋งŒ์ด ์ง„์งœ ๋ณ€๊ฒฝ
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€ S = ํฌ๊ธฐ ๋ณ€๊ฒฝ
ํ”Œ๋ž˜๊ทธ ์˜๋ฏธ ์ด๊ด€ ๋Œ€์ƒ์ธ๊ฐ€
5 ํŒŒ์ผ ๋‚ด์šฉ์ด ๋‹ค๋ฅด๋‹ค โœ… ์ด๊ฒƒ๋งŒ ๋ณด๋ฉด ๋œ๋‹ค
S / T ํฌ๊ธฐ, mtime ๋ณด์กฐ ์‹ ํ˜ธ
M ๊ถŒํ•œ(mode) ํ•˜๋“œ๋‹ ํ”์ ์ผ ์ˆ˜ ์žˆ์Œ
U / G ์†Œ์œ ์ž, ๊ทธ๋ฃน ๋‚ฎ์Œ
L ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๋Œ€์ƒ ๋‚ฎ์Œ

5๊ฐ€ ์—†์œผ๋ฉด ๋‚ด์šฉ์€ ๊ทธ๋Œ€๋กœ๋‹ค. ๊ถŒํ•œ๋งŒ ๋ฐ”๋€ ๊ฒƒ์„ ๋‚ด์šฉ ๋ณ€๊ฒฝ๊ณผ ๊ฐ™์€ ๋ฌด๊ฒŒ๋กœ ์˜ฌ๋ฆฌ๋ฉด ์ด๊ด€ ๋ชฉ๋ก์ด ๋…ธ์ด์ฆˆ๋กœ ๋ถ€ํ‘ผ๋‹ค. 1์ฐจ ํ•„ํ„ฐ๋Š” 5 ํ•˜๋‚˜๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค.

# ๋‚ด์šฉ์ด ๋ฐ”๋€ config ํŒŒ์ผ๋งŒ
$ sudo rpm -Vac | awk '$1 ~ /5/ {print $NF}'

๋ฒ”์œ„๋Š” ๋‘˜ ์ค‘์— ๊ณ ๋ฅธ๋‹ค.

๋ช…๋ น ๋ฒ”์œ„ ์‹ค์ธก ์†Œ์š”
rpm -Vac config ํŒŒ์ผ๋งŒ ์•ฝ 2.2์ดˆ
rpm -Va ์ „์ฒด ํŒŒ์ผ ์•ฝ 7์ดˆ

์šด์˜ ์ค‘์ธ ์žฅ๋น„์—์„œ ๋Œ๋ ค๋„ ๋ถ€๋‹ด์ด ์—†๋Š” ์ˆ˜์ค€์ด๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ณ€์กฐ๊นŒ์ง€ ๋ณด๋ ค๋ฉด -Va๋ฅผ ์“ฐ๋˜, ์ด๊ด€ ๋ชฉ์ ์ด๋ผ๋ฉด -Vac๊ฐ€ ๋งž๋‹ค. ํŒจํ‚ค์ง€๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ์ƒˆ ์„œ๋ฒ„์—์„œ ์–ด์ฐจํ”ผ ๋‹ค์‹œ ์„ค์น˜๋œ๋‹ค.

๐Ÿ›‘ ๋นˆ ๊ฒฐ๊ณผ๋ฅผ ๋ฌด๋ณ€๊ฒฝ์œผ๋กœ ์ฝ์ง€ ๋ง ๊ฒƒ

์ด ๋ฐฉ๋ฒ•์˜ ์ตœ๋Œ€ ํ•จ์ •์ด๋‹ค. ๋žฉ์—์„œ ์‹ค์ œ๋กœ ๋‹นํ–ˆ๋‹ค.

$ rpm -Vac 2>/dev/null | wc -l
0

0๊ฑด์ด๋‹ค. 3๋…„ ๊ตด๋ฆฐ ์„œ๋ฒ„์ธ๋ฐ ์•„๋ฌด๋„ ์„ค์ •์„ ์•ˆ ๊ฑด๋“œ๋ ธ๋‹ค๋Š” ๋œป์ผ๊นŒ. ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ๊ฑท์–ด๋‚ด๋ฉด ๋‹ต์ด ๋‚˜์˜จ๋‹ค.

$ rpm -Vac
error: rpmdb: BDB0113 Thread/process failed: Thread died in Berkeley DB library
error: db5 error(-30973) from dbenv->failchk: DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages database in /var/lib/rpm

2>/dev/null์ด ์—๋Ÿฌ๋ฅผ ํ†ต์งธ๋กœ ์‚ผ์ผœ ์กฐ์šฉํžˆ 0๊ฑด์ด ๋๋‹ค. ์ง„๋‹จ ์Šคํฌ๋ฆฝํŠธ์— ์Šต๊ด€์ ์œผ๋กœ ๋ถ™์ด๋Š” ๊ทธ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋‹ค. ์ด๊ด€ ๋ชฉ์ ์ด๋ฉด ๋Œ€์ƒ์„ ์ „๋ถ€ ๋†“์น˜๊ณ , ์ ๊ฒ€ ๋ชฉ์ ์ด๋ฉด "๊นจ๋—ํ•œ ์„œ๋ฒ„"๋กœ ์˜คํŒํ•œ๋‹ค. ๋‘˜ ๋‹ค ํ‹€๋ฆฐ ๋ฐฉํ–ฅ์œผ๋กœ ํ‹€๋ฆฐ๋‹ค.

๋นˆ ์ถœ๋ ฅ์€ ๋ถ€์žฌ์˜ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. 0๊ฑด๊ณผ "์…€ ์ˆ˜ ์—†์—ˆ๋‹ค"๋Š” ๋‹ค๋ฅธ ๊ฒฐ๊ณผ์ธ๋ฐ, wc -l์„ ๊ฑฐ์น˜๋ฉด ๋˜‘๊ฐ™์ด 0์œผ๋กœ ๋ณด์ธ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฒ€์ฆ๋ณด๋‹ค DB ๊ฑด์ „์„ฑ ํ™•์ธ์ด ๋จผ์ €๋‹ค.

# 1. DB๊ฐ€ ์—ด๋ฆฌ๋Š”์ง€๋ถ€ํ„ฐ
$ rpm -q rpm
rpm-4.16.1.3-29.el9.x86_64        # ์—ฌ๊ธฐ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๊ทธ๋‹ค์Œ์€ ์˜๋ฏธ ์—†๋‹ค

# 2. ์†์ƒ์ด๋ฉด ๋ณต๊ตฌ
$ sudo rpm --rebuilddb

RHEL 8 ๊ณ„์—ด์€ Berkeley DB, RHEL 9๋ถ€ํ„ฐ๋Š” sqlite๋ฅผ ๋ฐฑ์—”๋“œ๋กœ ์“ด๋‹ค. BDB0113 ๊ณ„์—ด ์˜ค๋ฅ˜๋Š” el8 ์ดํ•˜์—์„œ ์ฃผ๋กœ ๋‚˜๊ณ  el9์—์„œ๋Š” ๋“œ๋ฌผ๋‹ค. ์˜ค๋ž˜๋œ ์žฅ๋น„๋ฅผ ์ด๊ด€ํ•˜๋Š” ์ƒํ™ฉ์ด ์ •ํ™•ํžˆ el8 ์ดํ•˜๋ผ๋Š” ์ ์ด ๊ณ ์•ฝํ•˜๋‹ค.

sudo ์‹คํŒจ์™€ DB ์†์ƒ์„ ๊ตฌ๋ถ„ํ•œ๋‹ค

๋žฉ์—์„œ ํ•œ ๋ฒˆ ๋” ํ—›์งš์€ ์ž๋ฆฌ๋‹ค. ๋น„๋Œ€ํ™”์‹์œผ๋กœ ๋Œ๋ฆด ๋•Œ sudo๊ฐ€ ๋ง‰ํ˜€๋„ ๊ฒ‰๋ณด๊ธฐ ์ฆ์ƒ์ด ๊ฐ™๋‹ค.

$ sudo -n rpm -Vac 2>/dev/null | wc -l
0                                  # ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ชป ๋ฌผ์–ด์„œ 0์ผ ์ˆ˜๋„ ์žˆ๋‹ค

๋‘˜์„ ๊ฐ€๋ฅด๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. ์ข…๋ฃŒ ์ฝ”๋“œ์™€ ํ‘œ์ค€ ์˜ค๋ฅ˜๋ฅผ ๋ฒ„๋ฆฌ์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

$ sudo -n rpm -Vac > /tmp/drift.txt
$ echo "exit=$?  lines=$(wc -l < /tmp/drift.txt)"
exit=1  lines=0                    # 0๊ฑด์ธ๋ฐ exit์ด 0์ด ์•„๋‹ˆ๋ฉด ์‹คํŒจ๋‹ค

exit=0 + lines=0์ด๋ผ์•ผ ๋น„๋กœ์†Œ "๋ณ€๊ฒฝ ์—†์Œ"์ด๋‹ค.

? = ๋ชป ๋ณธ ๊ฒƒ์ด์ง€ ์—†๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค

sudo ์—†์ด ๋Œ๋ฆฌ๋ฉด ์ฝ๊ธฐ ๊ถŒํ•œ์ด ์—†๋Š” ํŒŒ์ผ์—์„œ ์ฒดํฌ์„ฌ์„ ๊ณ„์‚ฐํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๊ทธ ์ž๋ฆฌ์— ?๊ฐ€ ์ฐํžŒ๋‹ค.

$ rpm -Vac                          # ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž
..?......  c /etc/shadow
missing     (Permission denied) /etc/pki/tls/private/localhost.key

Rocky Linux 9 ํ™˜๊ฒฝ์—์„œ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋กœ ๋Œ๋ ธ์„ ๋•Œ ? ํ•ญ๋ชฉ์ด 18๊ฑด, missing (Permission denied)๊ฐ€ 3,030๊ฑด ๋‚˜์™”๋‹ค. ํ›„์ž๋Š” ๊ฐ€์งœ ์‚ญ์ œ๋‹ค. ํŒŒ์ผ์€ ๋ฉ€์ฉกํžˆ ์žˆ๊ณ  ์ฝ์ง€ ๋ชปํ–ˆ์„ ๋ฟ์ธ๋ฐ ์ถœ๋ ฅ๋งŒ ๋ณด๋ฉด ์‚ฌ๋ผ์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ์ฝํžŒ๋‹ค.

  • sudo ํ•„์ˆ˜. ๊ถŒํ•œ ์—†์ด ๋Œ๋ฆฐ ๊ฒฐ๊ณผ๋Š” ๋ชฉ๋ก์ด ์•„๋‹ˆ๋ผ ์ถ”์ •์ด๋‹ค
  • ๊ทธ๋ž˜๋„ ๋‚จ๋Š” ?๋Š” ๋”ฐ๋กœ ์„ธ์–ด ๋ณด๊ณ ํ•œ๋‹ค. "๋ณ€๊ฒฝ N๊ฑด, ํ™•์ธ ๋ถˆ๊ฐ€ M๊ฑด"์ด๋ผ์•ผ ๋ฐ›๋Š” ์ชฝ์ด ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค

RPM์ด ๋๋‚ด ๋ชป ๋ณด๋Š” ๋‘ ์˜์—ญ

rpm -Vac๋Š” ํŒจํ‚ค์ง€๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ํŒŒ์ผ๋งŒ ๋ณธ๋‹ค. ์„œ๋ฒ„ ์ƒํƒœ์˜ ์ƒ๋‹น ๋ถ€๋ถ„์ด ๊ทธ ๋ฐ–์— ์žˆ๋‹ค.

์„œ๋ฒ„ ์ƒํƒœ
ํŒจํ‚ค์ง€ ์†Œ์† ํŒŒ์ผ
ํŒจํ‚ค์ง€ ๋ฏธ์†Œ์† ํŒŒ์ผ
ํŒŒ์ผ์ด ์•„๋‹Œ ์ƒํƒœ
rpm -Vac ๋กœ ๊ฒ€์ถœ
rpm -qf ๋กœ ์—ญ์กฐํšŒ
์„œ๋ธŒ์‹œ์Šคํ…œ๋ณ„ ์กฐํšŒ
์ž๋™ ์ƒ์„ฑ๋ฌผ ์ œ์™ธ ํ•„ํ„ฐ
์ด๊ด€ ๋Œ€์ƒ ๋ชฉ๋ก

1. ํŒจํ‚ค์ง€์— ์†ํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ

์‚ฌ๋žŒ์ด ์ƒˆ๋กœ ๋งŒ๋“  ๊ฒƒ๋“ค์ด๋‹ค. ์—ญ์กฐํšŒ๋กœ ์ฐพ๋Š”๋‹ค.

$ find /etc -type f | xargs -r rpm -qf 2>&1 | grep 'not owned by any package'

์—ฌ๊ธฐ์„œ ๋ฐ”๋กœ ๋ชฉ๋ก์„ ์“ฐ๋ฉด ์•ˆ ๋œ๋‹ค. ์ž๋™ ์ƒ์„ฑ๋ฌผ์ด ์„ž์—ฌ ์žˆ๋‹ค.

์ œ์™ธ ๋Œ€์ƒ ์ด์œ 
/etc/ssh/ssh_host_* โš ๏ธ ์˜ฎ๊ธฐ๋ฉด ๋‘ ์„œ๋ฒ„๊ฐ€ ๊ฐ™์€ ์‹ ์›์„ ๊ฐ–๋Š”๋‹ค
/etc/machine-id ๋ถ€ํŒ… ์‹œ ์ƒ์„ฑ๋˜๋Š” ๊ณ ์œ  ์‹๋ณ„์ž
/etc/.updated, /etc/subuid- ๋“ฑ ๋ฐฑ์—… ์ž”์žฌ ์‹œ์Šคํ…œ์ด ๋งŒ๋“  ์‚ฌ๋ณธ
/etc/nvme/ ๊ฐ™์€ ํ•˜๋“œ์›จ์–ด ์ข…์† ๊ฒฝ๋กœ ์ƒˆ ์žฅ๋น„์—์„œ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค

โš ๏ธ SSH ํ˜ธ์ŠคํŠธ ํ‚ค๋ฅผ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธฐ๋ฉด ์ ‘์†ํ•˜๋Š” ์ชฝ์—์„œ๋Š” ๋‘ ์„œ๋ฒ„๊ฐ€ ๊ตฌ๋ถ„๋˜์ง€ ์•Š๋Š”๋‹ค. ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์–ด์ง€๋Š” ํŒŒ์ผ์ด๋ผ ๋” ์œ„ํ—˜ํ•˜๋‹ค.

ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜๋‹ˆ 21๊ฑด์ด 7๊ฑด์œผ๋กœ ์ค„์—ˆ๋‹ค. ์ค„์–ด๋“  14๊ฑด์ด ์ „๋ถ€ ์˜ฎ๊ธฐ๋ฉด ์•ˆ ๋˜๋Š” ๊ฒƒ๋“ค์ด์—ˆ๋‹ค.

2. ํŒŒ์ผ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ

๋ฐฉํ™”๋ฒฝ ๊ทœ์น™, SELinux ์„ค์ •, ๊ณ„์ •, ์Šค์ผ€์ค„์€ ํŒŒ์ผ ํ•˜๋‚˜๋กœ ํ‘œํ˜„๋˜์ง€ ์•Š๋Š”๋‹ค. ์„œ๋ธŒ์‹œ์Šคํ…œ์— ์ง์ ‘ ๋ฌผ์–ด์•ผ ํ•œ๋‹ค.

# ๋ฐฉํ™”๋ฒฝ
firewall-cmd --list-all-zones

# SELinux ์ปค์Šคํ…€๋งŒ (-C ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฑธ๋Ÿฌ ์ค€๋‹ค)
semanage boolean -l -C
semanage port -l -C
semanage fcontext -l -C

# ์‚ฌ๋žŒ์ด ๋งŒ๋“  ๊ณ„์ •
awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd

# ํ™œ์„ฑ ์„œ๋น„์Šค
systemctl list-unit-files --state=enabled

semanage์— ๋ถ™๋Š” -C๊ฐ€ ํ•ต์‹ฌ์ด๋‹ค. ์ด๊ฒŒ ์—†์œผ๋ฉด ๋ฐฐํฌํŒ ๊ธฐ๋ณธ ์ •์ฑ… ์ˆ˜๋ฐฑ ์ค„์ด ํ†ต์งธ๋กœ ๋‚˜์™€ ์‚ฌ๋žŒ์ด ๋ฐ”๊พผ ํ•ญ๋ชฉ์„ ๋ฎ๋Š”๋‹ค.

โš ๏ธ systemd ์ชฝ์€ /etc/systemd/system/*.wants/๋ฅผ ๊ฒฐ๊ณผ์—์„œ ๋นผ์•ผ ํ•œ๋‹ค. systemctl enable์ด ๋งŒ๋“  ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ผ ํ™œ์„ฑํ™”๋œ ์„œ๋น„์Šค ์ˆ˜๋งŒํผ ์ค„์ด ๋Š˜์–ด๋‚œ๋‹ค. ๋žฉ์—์„œ ๋…ธ์ด์ฆˆ 20์ค„์ด ์—ฌ๊ธฐ์„œ ๋‚˜์™”๋‹ค.

์›๊ฒฉ์ง€ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„๋‚ด์•ผ ํ•  ๋•Œ

์ง์ ‘ ์ ‘์†์ด ์•ˆ ๋˜๋Š” ์„œ๋ฒ„๋ผ๋ฉด ์ƒ๋Œ€์—๊ฒŒ ๋ช…๋ น์„ ๋ณด๋‚ด๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํšŒ์‹ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ๋‘ ๊ฐ€์ง€๊ฐ€ ์‹ค๋ฌด์—์„œ ๊ฐˆ๋ฆฐ๋‹ค.

์Šคํฌ๋ฆฝํŠธ๋Š” ์ฒจ๋ถ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ณด์•ˆ ์ •์ฑ…์ƒ ์ฒจ๋ถ€ํŒŒ์ผ์ด ์ฐจ๋‹จ๋˜๋Š” ํ™˜๊ฒฝ์ด ํ”ํ•˜๋‹ค. ๋ฉ”์ผ ๋ณธ๋ฌธ์— heredoc ํ˜•ํƒœ๋กœ ๋„ฃ์œผ๋ฉด ์ƒ๋Œ€๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ถ™์—ฌ ๋„ฃ์–ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

cat > /tmp/os_config_diff.sh <<'SCRIPT'
#!/bin/bash
# ์ฝ๊ธฐ ์ „์šฉ. ์–ด๋–ค ํŒŒ์ผ๋„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.
rpm -q rpm || { echo "RPMDB ERROR"; exit 1; }
echo "== ๋ณ€๊ฒฝ๋œ config =="
rpm -Vac | awk '$1 ~ /5/ {print $NF}'
echo "== ๋ฏธ์†Œ์† ํŒŒ์ผ =="
find /etc -type f | xargs -r rpm -qf 2>&1 | grep 'not owned by any package'
SCRIPT
bash /tmp/os_config_diff.sh

์š”์ฒญ์€ ํŒŒ์ผ ๋ชฉ๋ก๊นŒ์ง€๋งŒ ํ•œ๋‹ค. ๋‚ด์šฉ์€ 2์ฐจ ์š”์ฒญ์ด ์ˆœ์„œ๋‹ค. ๋ชฉ๋ก๊ณผ ๋‚ด์šฉ์„ ํ•œ ๋ฒˆ์— ๋‹ฌ๋ผ๊ณ  ํ•˜๋ฉด ์„ค์ • ํŒŒ์ผ์— ์ž๊ฒฉ ์ฆ๋ช…์ด ๋“ค์–ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด ๋ฐ˜์ถœ ์Šน์ธ ๋‹จ๊ณ„์—์„œ ๋ง‰ํžŒ๋‹ค. ๋ชฉ๋ก์„ ๋จผ์ € ๋ฐ›์•„ ํ•„์š”ํ•œ ํŒŒ์ผ์„ ์ถ”๋ฆฐ ๋’ค ๊ทธ๊ฒƒ๋งŒ ์š”์ฒญํ•˜๋ฉด ํ†ต๊ณผํ•œ๋‹ค.

์ฝ๊ธฐ ์ „์šฉ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์Šคํฌ๋ฆฝํŠธ ์ฒซ ์ค„ ์ฃผ์„์— ๋ฐ•์•„ ๋‘๋Š” ๊ฒƒ๋„ ๊ฐ™์€ ์ด์œ ๋‹ค. ๋ฐ›๋Š” ์ชฝ์€ ์‹คํ–‰ ์ „์— ๊ทธ ํ•œ ์ค„์„ ๋ณธ๋‹ค.

์ •๋ฆฌ

  1. rpm -q rpm์œผ๋กœ DB๋ถ€ํ„ฐ ํ™•์ธํ•œ๋‹ค. ์—ฌ๊ธฐ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๋‚˜๋จธ์ง€ ๊ฒฐ๊ณผ๋Š” ์ „๋ถ€ ๊ฑฐ์ง“์ด๋‹ค
  2. rpm -Vac๋กœ config ๋ณ€๊ฒฝ์„ ๋ฝ‘๊ณ  5 ํ”Œ๋ž˜๊ทธ๋งŒ 1์ฐจ ๋Œ€์ƒ์œผ๋กœ ๋ณธ๋‹ค
  3. 2>/dev/null์„ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค. ๋ถ™์˜€๋‹ค๋ฉด ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ๊ฐ™์ด ๋ณธ๋‹ค
  4. sudo๋กœ ๋Œ๋ฆฌ๊ณ , ๋‚จ์€ ? ๊ฑด์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋ณด๊ณ ํ•œ๋‹ค
  5. ํŒจํ‚ค์ง€ ๋ฏธ์†Œ์† ํŒŒ์ผ์„ ์—ญ์กฐํšŒํ•˜๊ณ  ์ž๋™ ์ƒ์„ฑ๋ฌผ์„ ๊ฑธ๋Ÿฌ๋‚ธ๋‹ค
  6. ๋ฐฉํ™”๋ฒฝ, SELinux, ๊ณ„์ •, ์„œ๋น„์Šค๋Š” ์„œ๋ธŒ์‹œ์Šคํ…œ์— ๋”ฐ๋กœ ๋ฌป๋Š”๋‹ค

๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•œ ๊ฐ€์ง€๋ฅผ ๊ณ ๋ฅด๋ผ๋ฉด ์ฒซ ๋ฒˆ์งธ๋‹ค. ์ด ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฌผ์€ "๋ณ€๊ฒฝ ๋ชฉ๋ก"์ด๊ณ , ์‹คํŒจํ–ˆ์„ ๋•Œ์˜ ๋ชจ์Šต๋„ ๋˜‘๊ฐ™์ด ๋นˆ ๋ชฉ๋ก์ด๋‹ค. ์„ฑ๊ณต๊ณผ ์‹คํŒจ๊ฐ€ ๊ฐ™์€ ๋ชจ์–‘์œผ๋กœ ๋ณด์ด๋Š” ์ ˆ์ฐจ์—์„œ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ธฐ ์ „์— ์ „์ œ๋ถ€ํ„ฐ ์ฆ๋ช…ํ•ด์•ผ ํ•œ๋‹ค.

  • rpm -q rpm์œผ๋กœ DB ๊ฑด์ „์„ฑ์„ ๋จผ์ € ํ™•์ธํ•œ๋‹ค
  • rpm -Vac์— 2>/dev/null์„ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค
  • 0๊ฑด์ด๋ฉด ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ 0์ธ์ง€ ํ™•์ธํ•œ๋‹ค. exit != 0์ด๋ฉด ์‹คํŒจ๋‹ค
  • sudo -n ์‹คํŒจ์™€ DB ์†์ƒ์„ ๊ตฌ๋ถ„ํ•œ๋‹ค
  • 5 ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ๋งŒ 1์ฐจ ์ด๊ด€ ๋Œ€์ƒ์œผ๋กœ ์‚ผ๋Š”๋‹ค
  • ? ํ•ญ๋ชฉ ๊ฑด์ˆ˜๋ฅผ ๊ฒฐ๊ณผ์— ํ•จ๊ป˜ ์ ๋Š”๋‹ค
  • ๋ฏธ์†Œ์† ํŒŒ์ผ์—์„œ SSH ํ˜ธ์ŠคํŠธ ํ‚ค์™€ machine-id๋ฅผ ์ œ์™ธํ•œ๋‹ค
  • semanage์— -C๋ฅผ ๋ถ™์—ฌ ๊ธฐ๋ณธ ์ •์ฑ…์„ ๊ฑธ๋Ÿฌ๋‚ธ๋‹ค
  • systemd ๊ฒฐ๊ณผ์—์„œ *.wants/ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋บ€๋‹ค
  • ์›๊ฒฉ ์š”์ฒญ์€ ํŒŒ์ผ ๋ชฉ๋ก๊นŒ์ง€๋งŒ, ๋‚ด์šฉ์€ 2์ฐจ๋กœ ๋‚˜๋ˆˆ๋‹ค

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ™”๋ฉด ์ชฝ์„ ๋‹ค๋ฃฌ๋‹ค. ๋””์ž์ธ ์‹œ์Šคํ…œ ์—†์ด ๊ตด๋ ค ์˜จ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ๋„ค ๊ณณ์„ ํ† ํฐ ์ฒด๊ณ„๋กœ ์ •๋ฆฌํ•˜๋ฉด์„œ, ์ธ๋ผ์ธ ์Šคํƒ€์ผ 38๊ฐœ๊ฐ€ ๊ฒŒ์œผ๋ฆ„์ด ์•„๋‹ˆ๋ผ ๋™์  ์Šคํƒ€์ผ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค๋Š” ๊ฒƒ๊ณผ ๋‹คํฌ ๋ชจ๋“œ ํ† ํฐ ๋‘ ๊ฐœ๊ฐ€ ์˜ˆ์™ธ ์„ ํƒ์ž ์Šค๋ฌด ๊ฐœ๋ฅผ ๋ถ€๋ฅธ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณธ๋‹ค.

์ฐธ๊ณ ๋ฌธํ—Œ

์ด์–ด์„œ ์ฝ๊ธฐ


@leekh8
๋ณด์•ˆ, ์›น ๊ฐœ๋ฐœ, Python์„ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ