LabHub
学习 学习路径 课程

面对陌生系统

不动手也能回答,动了就要还原

在 LabHub 中继续学习

한국어 원문으로 표시합니다.

목표

고객 운영 서버에 대한 다섯 가지 질문에 읽기 전용 수단만으로 답한다. 그다음 디렉터리 상태를 지문으로 굳히고 견주는 도구를 만들어, 꼭 바꿔야 하는 설정 한 줄을 바꾸고 확인하고 실제로 되돌려 스냅샷과 내용이 다른 파일이 0개임을 증명한다.

왜 중요한가

조사 중에 무언가를 바꾸면 그 뒤로 보이는 값이 원래 값인지 우리가 만든 값인지 알 수 없게 된다. 고객이 그 사이에 본 지표도 오염되고, "언제부터 이렇게 됐죠" 라는 질문에 우리가 답의 일부가 된다. 작은 변경일수록 되돌리는 것을 잊는다. 그리고 되돌렸다고 믿는 것과 되돌렸다는 것이 증명되는 것은 다르다. "원래대로 했습니다" 는 검증할 수 없는 문장이고, "되돌린 뒤 스냅샷과 견주었더니 내용이 다른 파일이 0개입니다" 는 확인할 수 있는 문장이다. 그보다 먼저 물을 것은 정말 바꿔야 답이 나오는가다. 많은 경우 같은 질문에 읽기 전용으로 답하는 길이 있다. 읽기 전용인지 아닌지를 스스로 속이지 않는 방법은 쓴 명령을 기록하는 것이다. 이 실습은 고객 승인을 받아 반영하는 변경 작업과 다르다. 그 앞 단계 — 조사 중에 손이 미끄러지는 순간에 대한 첫 주의 규율이다. 채점기는 여러분이 적어 낸 문구를 믿지 않는다. 다섯 답은 채점기가 직접 다시 재고, 스냅샷 도구에는 파일을 더하고 지우고 내용을 바꾸고 권한만 바꾸고 시각만 바꾼 자리를 만들어 다섯 가지를 갈라내는지 본다.

단계

  1. /root/readonly/gen_site.py 를 만들어 실행해 /root/readonly/site/ 를 만드세요. 설정·주문 원장 240행·로그 180줄·조회기가 들어갑니다.
  2. 읽기 전용 수단만으로 다섯 질문에 답해 /root/readonly/answers.json 에 적으세요. 답마다 쓴 명령을 함께 남깁니다.
  3. /root/readonly/snapshot.py 를 만들어 디렉터리를 훑어 파일마다 지문·크기·권한·수정 시각을 담고, 지금 상태를 /root/readonly/baseline.json 에 굳히세요.
  4. --baseline <스냅샷> 을 더해 견준 결과를 내게 하세요. added·removed·changed·mtime_only·same 다섯으로 가릅니다.
  5. 설정의 max_retry 를 3에서 5로 바꾸고, 무엇을 왜 바꾸는지와 되돌리는 명령을 /root/readonly/change.json 에 적으세요.
  6. 조회기로 바꾼 효과를 확인해 /root/readonly/verify.json 에 적으세요.
  7. 되돌리고, 스냅샷과 견준 결과를 /root/readonly/revert_diff.json 에 남기세요. 내용이 다른 파일이 0개여야 합니다.
  8. /root/readonly/readonly_report.md 에 네 절로 적으세요.

참고

운영 서버를 손에 쥐기

/root/readonly/gen_site.py 를 만들어 실행해 /root/readonly/site/ 를 만드세요. etc/app.conf, data/app.db(orders 240행), var/log/app.log(180줄), bin/report.py 가 들어갑니다.

조회기 report.py 는 고객 서버에 이미 있는 도구라고 생각하세요. 우리가 만든 것이 아니라 거기 있던 것이고, 우리는 그것을 돌려 볼 수만 있습니다. 만든 뒤 조회기를 한 번 돌려 무엇을 물을 수 있는지 보세요.

읽기만으로 답하기

/root/readonly/answers.json 에 다섯 질문의 답을 적으세요. id 는 app_version·pending_orders·log_errors·backoff_ms·oldest_pending_days 이고, 답마다 실제로 쓴 명령을 how 에 남깁니다.

설정은 열어 읽고, 원장은 읽기 전용으로 열어 세고, 로그는 줄을 세면 됩니다. 이미 있는 조회기를 쓰는 것도 읽기입니다. how 에 적은 명령에 쓰기가 섞여 있으면 채점기가 잡으므로, 적으면서 스스로 확인하세요.

바꾸기 전 상태를 굳히기

/root/readonly/snapshot.py 를 만들어 --dir --out 으로 디렉터리를 훑고, /root/readonly/baseline.json 에 지금의 site 상태를 굳히세요. 파일마다 sha256·bytes·mode·mtime 을 담습니다.

굳혀 두지 않으면 나중에 되돌렸다는 것을 증명할 것이 없습니다. 경로는 --dir 을 기준으로 한 상대 경로로 담고, 디렉터리와 심볼릭 링크는 담지 않습니다. mode 는 권한 세 자리만, mtime 은 초 단위 정수로 적으세요.

견주는 기능 더하기

--baseline <스냅샷> 을 더해 견준 결과를 내게 하세요. added·removed·changed·mtime_only·same 다섯으로 가르고, changed 에는 달라진 항목 이름만 fields 에 담습니다.

내용과 크기와 권한이 같고 수정 시각만 다른 경우를 changed 에 넣으면, 되돌린 뒤 결과가 늘 빨강이 되어 아무 정보도 주지 못합니다. 그 경우를 따로 세는 것이 이 도구의 핵심입니다. 채점기는 다섯 경우를 모두 만들어 넣습니다.

한 건만, 되돌릴 준비를 하고

설정의 max_retry 를 3에서 5로 바꾸고 /root/readonly/change.json 에 target_file·key·before·after·sha256_before·sha256_after·why·approved_by·baseline·apply·rollback 을 적으세요. rollback 에는 원래 값이 들어 있어야 합니다.

되돌리는 명령은 바꾸기 전에 적으세요. 바꾼 뒤에 적으려 하면 원래 값을 기억에 의존하게 되고, 3이었는지 30이었는지는 30분 뒤에 놀랍도록 흐려집니다. 승인도 한 줄로 남기세요 — 없으면 나중에 그 변경은 우리가 몰래 한 것이 됩니다.

의도한 효과가 났는지 값으로 보기

조회기로 바꾼 효과를 확인해 /root/readonly/verify.json 에 question·command·before·after·confirmed 를 적으세요. question 은 retry_budget 이고, before 와 after 는 바꾸기 전과 후의 조회기 출력입니다.

바꿨다는 사실과 바꾼 것이 의도한 효과를 냈다는 사실은 다릅니다. 조회기는 --conf 로 다른 설정 파일을 줄 수 있으니, 바꾸기 전 값을 담은 임시 설정으로 한 번 돌려 before 를 얻을 수 있습니다. 출력은 그대로 문자열로 적으세요.

되돌리고 증명하기

change.json 의 rollback 대로 되돌린 뒤, 스냅샷과 견준 결과를 /root/readonly/revert_diff.json 에 남기세요. added·removed 가 비어 있고 changed 가 0개여야 합니다. 수정 시각만 다른 파일은 mtime_only 에 남습니다.

되돌렸다고 믿는 것과 되돌렸다는 것이 증명되는 것은 다릅니다. 견준 결과가 증명입니다. 수정 시각 차이를 숨기려고 시각까지 맞추지 마세요 — 그때부터는 우리가 흔적을 지운 것이 됩니다.

무엇을 만졌고 무엇을 되돌렸는지 적기

/root/readonly/readonly_report.md## 읽기만으로 답한 것 ## 꼭 바꿔야 했던 한 건 ## 바꾼 뒤 무엇을 확인했나 ## 되돌린 증거 네 절로 적으세요. 다섯 질문의 id, 바꾼 키와 값, 조회기 출력의 변화, 견준 결과의 숫자가 모두 나와야 합니다.

보고서는 손으로 쓰지 말고 answers·change·verify·revert_diff 네 파일에서 만들어 내세요. 마지막 절에는 남은 자국(수정 시각만 다른 파일)도 그대로 적으세요 — 숨기면 그때부터 우리가 흔적을 지운 것이 됩니다.