퀴즈: 고객 VM 에 서비스로 설치하기
orders.service 를 systemctl start 로 띄워 잘 돌고 있다. 재부팅 뒤에도 뜨게 하려면 무엇이 반드시 있어야 하나?
- 서비스가 지금 active 상태이면 systemd 가 종료 직전 상태를 저장해 부팅 때 그대로 되살린다
- Restart=always 를 넣으면 부팅 뒤 멈춰 있는 서비스로 보고 자동으로 다시 시작한다
- systemctl enable 로 [Install] 의 WantedBy 대상 target 의 .wants 디렉터리에 심링크를 만든다
- After=multi-user.target 을 넣으면 그 target 에 도달할 때 이 서비스가 함께 시작된다
네트워크가 설정된 뒤에 떠야 하는 서비스에 After=network-online.target 한 줄만 적었다. 무엇이 모자라나?
- Wants=network-online.target 이 없어 그 target 을 아무도 끌어오지 않으면 순서가 의미를 잃는다
- After 는 [Install] 섹션에만 쓸 수 있어서 [Unit] 에 적은 이 줄은 무시된다
- network-online.target 은 network.target 의 별칭이라 적어도 효과가 없고 Requires 가 필요하다
- After 는 대상이 실패하면 이 서비스도 멈추게 하므로 네트워크 장애 때 서비스가 내려간다
Restart=on-failure 인 서비스의 주 프로세스에 평범한 kill <pid>(SIGTERM)을 보냈다. 매뉴얼대로라면 어떻게 되나?
- 신호로 죽었으므로 on-failure 가 RestartSec 뒤에 새 프로세스를 띄운다
- SIGTERM 은 깨끗한 종료로 치므로 재시작하지 않고 서비스가 멈춘 채 남는다
- SIGTERM 은 systemd 만 보낼 수 있어 다른 프로세스가 보내면 무시된다
- 시작 제한에 곧바로 걸려 failed 상태가 되고 reset-failed 전까지 시작할 수 없다
EnvironmentFile 로 읽는 /etc/orders/orders.env 의 토큰만 바꿨다. 실행 중인 서비스에 새 토큰을 반영하는 올바른 방법은?
- systemctl daemon-reload 만 하면 로드된 설정과 함께 실행 중인 프로세스의 환경도 바뀐다
- 파일을 저장하는 순간 systemd 가 변경을 감지해 프로세스에 새 환경 변수를 넣어 준다
- 유닛 파일을 조금 고쳐 NeedDaemonReload 를 켠 뒤 reload 해야 환경 파일이 다시 읽힌다
- 유닛 파일은 그대로이므로 reload 는 필요 없고, 서비스를 재시작해 새 프로세스가 파일을 읽게 한다
ProtectSystem=strict 를 켰더니 앱이 /var/lib/orders/last-start.json 을 못 써서 죽었다. 가장 알맞은 조치는?
- ProtectSystem=full 로 낮추면 /var 는 원래 쓸 수 있으므로 샌드박싱을 유지한 채 해결된다
- PrivateTmp=yes 를 더하면 쓰기가 전용 /tmp 로 옮겨져 같은 경로에 쓸 수 있게 된다
- ReadWritePaths=/var/lib/orders 로 앱이 쓰는 경로만 다시 쓰기 가능하게 연다
- NoNewPrivileges=no 로 바꿔 앱이 필요할 때 쓰기 권한을 새로 얻게 한다
systemd-analyze security orders.service 의 전체 노출 점수가 샌드박싱 뒤 크게 내려갔다. 이 숫자를 인계 문서에 어떻게 적는 것이 맞나?
- 점수가 낮으니 서비스에 알려진 취약점이 없다는 보안 인증 결과로 적는다
- systemd 가 건 격리 장치만 훑은 비교 잣대로 적고, 앱 자체의 보안은 따로 판단한다고 쓴다
- 점수는 부팅할 때마다 무작위로 바뀌므로 인계 문서에는 적지 않는 것이 관례다
- 10.0 에 가까울수록 좁게 가둔 것이므로 점수를 더 올리는 것이 다음 목표라고 적는다