TT Lab
블로그 시작하기
배우기 러닝패스 코스

서버를 처음부터 잠근다

보안 갱신만, 자동으로, 확인 가능하게

TT Lab 에서 이어서 보기

이 실습은 VM 에서 돕니다

우분투 24.04 VM 한 대입니다. root 이고 systemd 와 커널 기능이 그대로 있습니다. 실습 파드에는 capability 가 없어 이 실습이 다루는 설정을 바꿀 수 없기 때문에 VM 으로 돕니다. 처음 뜨는 데 몇 분이 걸립니다. 세션이 끝나면 VM 은 통째로 사라지므로 남기고 싶은 것은 화면에서 복사해 두세요.

목표

보안 갱신만 자동으로 받도록 unattended-upgrades 를 설정합니다. 기능 갱신은 사람이 판단하게 남기고, 재부팅은 정해진 시각에만 하고, 무엇이 적용됐는지 로그로 확인합니다.

왜 중요한가

패치가 늦는 서버는 이미 공개된 취약점에 그대로 노출됩니다. 그렇다고 모든 갱신을 무턱대고 자동으로 받으면 기능 변경이 서비스를 깨뜨립니다. 균형점은 "보안 갱신은 빠르게 자동으로, 기능 갱신은 사람이 판단" 입니다. unattended-upgrades 의 Origins-Pattern 이 어느 묶음(보안/일반)을 자동으로 받을지 정합니다.

자동 갱신의 진짜 가치는 "확인할 수 있다" 는 데 있습니다. 무엇이 언제 적용됐는지 로그로 남지 않으면, 자동으로 됐는지 조용히 실패했는지 알 수 없습니다.

이 실습은 바깥 네트워크 대신 로컬 apt 저장소(준비 단계가 만든)를 씁니다. 보안 묶음과 일반 묶음에 패키지가 하나씩 올라와 있고, 설정이 보안 쪽만 집어 가는지를 봅니다. 설정과 판단은 실제 서버와 같습니다.

단계

  1. 밀려 있는 갱신을 /root/upd/01-pending.txt 에 적습니다.
  2. Origins-Pattern 으로 labhub-security 묶음만 대상으로 삼습니다.
  3. 재부팅을 02:00 으로 정합니다.
  4. apt-daily-upgrade 타이머와 20auto-upgrades 를 켭니다.
  5. 무인 갱신을 지금 돌려 labhub-webd 를 1.1 로 올립니다.
  6. labhub-report 가 2.0 그대로인지 /root/upd/06-held.txt 에 확인합니다.
  7. 적용 로그를 /root/upd/07-log.txt 에 남깁니다.

참고

지금 무엇이 밀려 있나

설치된 labhub-webd 와 labhub-report 의 현재 버전과, 저장소에 올라온 새 버전을 /root/upd/01-pending.txt 에 적으세요. 보안 묶음(labhub-security)과 일반 묶음(labhub-updates)에 각각 무엇이 있는지 보여야 합니다.

apt-cache policy <패키지> 는 설치된 버전과 후보 버전, 그리고 어느 묶음에서 왔는지 보여 줍니다. dpkg -l <패키지> 로 지금 버전을 봅니다.

보안 묶음만 집게 한다

/etc/apt/apt.conf.d/52labhub-security 에 Unattended-Upgrade::Origins-Pattern 을 두어 labhub-security 묶음(Suite)만 자동 갱신 대상으로 삼으세요. 일반 묶음(labhub-updates)은 포함하지 않습니다.

Origins-Pattern 은 "origin=Labhub,suite=labhub-security"; 처럼 적습니다. 우분투 기본 설정(50unattended-upgrades)의 Allowed-Origins 와 겹치지 않게 별도 파일에 둡니다. 묶음 이름은 Release 파일의 Suite 값입니다.

재부팅은 정해진 시간에만

같은 설정 또는 /etc/apt/apt.conf.d/52labhub-reboot 에, 재부팅이 필요하면 자동으로 재부팅하되 시각을 02:00 으로 정하세요(Automatic-Reboot "true", Automatic-Reboot-Time "02:00").

unattended-upgrades 는 커널 갱신처럼 재부팅이 필요한 경우를 압니다. 아무 때나 재부팅하면 서비스가 끊기므로 시각을 못박습니다. 두 줄 모두 Unattended-Upgrade:: 접두어를 씁니다.

자동으로 돌게 켠다

무인 갱신이 자동으로 돌도록 apt-daily-upgrade.timer 를 활성화하고, /etc/apt/apt.conf.d/20auto-upgrades 에 Update-Package-Lists 와 Unattended-Upgrade 를 "1" 로 두세요.

systemctl enable --now apt-daily-upgrade.timer 가 자동 실행을 켭니다. 20auto-upgrades 파일의 두 값이 0 이면 타이머가 돌아도 아무것도 하지 않습니다.

보안 갱신을 적용한다

무인 갱신을 지금 한 번 실제로 돌려 보안 패치를 적용하세요. labhub-webd 가 1.1 로 올라가야 합니다. 결과를 /root/upd/05-applied.txt 에 적습니다.

unattended-upgrade 를 인자 없이 돌리면 실제로 적용합니다(--dry-run 은 흉내만 냅니다). 적용 뒤 dpkg -l labhub-webd 로 버전을 확인하세요.

일반 갱신은 그대로 두었는가

일반 묶음의 labhub-report 가 아직 2.0 인지(자동 갱신이 건드리지 않았는지) 확인해 /root/upd/06-held.txt 에 적으세요. 2.0 이면 held, 2.1 이면 upgraded 를 적습니다.

보안만 자동으로 받기로 했으니 기능 갱신은 사람이 판단해 적용해야 합니다. dpkg -l labhub-report 로 버전을 봅니다. 여기서 2.1 이 돼 있다면 Origins-Pattern 이 너무 넓습니다.

결과를 확인할 수 있게 남긴다

무인 갱신 로그에서 이번에 적용된 패키지를 확인해 /root/upd/07-log.txt 에 남기세요. labhub-webd 가 적용 목록에 있어야 합니다.

unattended-upgrades 는 /var/log/unattended-upgrades/unattended-upgrades.log 에 무엇을 했는지 남깁니다. 자동 갱신의 가치는 '됐는지 확인할 수 있다' 는 데 있습니다 — 로그가 없으면 안 된 것과 구별되지 않습니다.