분석 · 관제기초 · 14분 읽기
로그 읽기: 사건·시간·주체 연결
로그 한 줄은 특정 구성요소가 남긴 관찰이다. 발생 시각·수집 시각·주체·결과를 구분해야 서로 다른 장비의 기록을 연결할 수 있다.
개념부터 찾아보기
정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.
이 노트에서 설명할 수 있게 되는 것
- 발생·수신·저장 시각으로 사건 순서와 수집 지연을 구분한다.
- 원본 필드가 정규화되는 과정에서 의미가 바뀌는 지점을 찾는다.
- 로그 누락·파싱 오류·실제 사건 부재를 구분할 증거를 정한다.
먼저 알면 좋은 개념보안의 기준: CIA·AAA와 위험 판단
01개념과 구성 요소
- 로그프로그램·커널·장비가 특정 사건과 상태를 기록한 자료다. 화면의 한 줄이 전체 행위와 동일하지는 않다.
- 연결 필드시각·호스트·프로그램··주체·대상·결과·요청 식별자가 사건 관계를 만든다.
- 저장 경로생성 프로그램, ·파일, 수집기, 중앙 저장소를 나누어 읽는다.
02서비스 재시작 원인을 로그로 좁히는 순서
- 현상과 시간 정하기어느 서비스가 언제부터 영향을 받았는지 범위를 정하고 시간대·시계 차이를 확인한다.
- 서비스 기록 조회unit 로그에서 종료 코드·재시작·실패 원인을 읽고 관련 PID·시각을 연결한다.
- 하위 원인 추적같은 시점의 커널·저장 장치·인증·감사 기록을 대조하여 I/O timeout 같은 선행 조건을 찾는다.
- 인과와 동시성 구분장치 지연→앱 정체→종료→재시작의 연결 근거를 확인한다. 가까운 시각의 두 줄만으로 원인을 확정하지 않는다.
- 원본·누락 점검원본과 수집 지연·중복·회전 상태를 확인하여 보이지 않는 기록이 실제 미발생인지 수집 누락인지 구분한다.
03로그 생성과 저장 경로는 별개
- 생성과 저장애플리케이션·인증·커널·서비스 관리자·네트워크 장비는 서로 다른 사건을 기록한다. 같은 사건이 과 파일에 동시에 나타날 수 있어 파일 수와 사건 수가 같지 않다.
- 실제 경로실제 service 설정··파일 을 따라 로그 생성과 저장 위치를 연결한다.
- 배포판별 파일RHEL 계열의 /var/log/messages, 계열의 /var/log/는 전통적인 일반 로그 경로다. journald-only 환경에는 이 파일이 없을 수 있다.
- 파일 부재파일이 없다는 사실만으로 로그 기능이 없다고 단정하지 않고 저장과 전달 구성을 함께 본다.
04텍스트 한 줄의 구조
- 텍스트 필드전통적 형태는 시각·호스트·프로그램[PID]·메시지로 읽을 수 있다. 형식에 따라 연도·timezone이 없거나 메시지 안에 추가 구조가 있다.
- PIDPID는 실행을 구분하는 단서지만 재부팅·시간 경과 뒤 재사용될 수 있으므로 host·boot·시각 문맥이 필요하다.
- 구조화 정보앱의 자유 문자열과 의 구조화 필드를 구분하면 grep error보다 정확하게 범위를 좁힐 수 있다. 어떤 프로그램은 오류를 WARNING에 기록하고 정상 시험 메시지에 error라는 단어를 넣을 수 있다.
- 단어와 문맥문자열 한 단어는 의미 판정의 시작일 뿐이다.
text
Oct 12 10:00:00 lab-host systemd[1]: training.service: Main process exited, code=exited, status=1/FAILURE
시각: Oct 12 10:00:00
호스트: lab-host
기록 주체: systemd, PID 1
대상 서비스: training.service
결과: 프로세스가 종료 코드 1로 종료원리를 설명하는 가상 학습 예시입니다.
05journal의 구조화된 조회
- 필드은 메시지 외에 unit·priority·boot· 등 문맥 필드를 보관할 수 있다. -u로 서비스를 고르고 -k로 커널 메시지를 보며 시간 범위를 정하면 관련 기록을 좁힐 수 있다.
- 조회 조건같은 시간에 여러 서비스가 재시작되는 원인을 찾을 때는 단일 unit만 보면 상위 원인을 놓칠 수 있다.
- 영속성journald의 영속성은 Storage 설정과 /var/log/ 같은 저장 위치에 영향을 받는다. 재부팅 전 자료가 필요한데 휘발성 저장만 사용하면 사건 경로가 끊길 수 있다.
- 파일 검증 한계 파일 검증은 구조·무결성 점검의 한 도구이며 모든 침해나 로그 누락을 자동 판별하는 기능으로 확대하지 않는다.
text
journalctl -u training.service --since "1 hour ago"
journalctl -k --since "1 hour ago"
journalctl -p warning..alert --since "1 hour ago"
journalctl --disk-usage현재 시스템의 로그를 읽는 예입니다. 실제 unit은 환경에 맞게 지정합니다.
06I/O 오류에서 재시작 반복까지
- I/O와 재시작저장 장치 timeout은 애플리케이션 I/O 정체, watchdog 또는 서비스 종료, 재시작 반복으로 이어질 수 있다. 마지막 restart 메시지만 보면 서비스 자체 결함으로 오해할 수 있지만 앞선 커널 I/O 기록이 공통 원인일 수 있다.
- 시스템 지표OOM·read-only remount·disk full도 여러 서비스의 동시 실패를 만들 수 있다. 종료 코드·signal·restart counter와 커널 시각을 연결하면 “무엇이 종료되었는가”와 “왜 영향을 받았는가”를 나눌 수 있다.
- 인과 검증원인과 결과가 시간상 가깝다는 사실만으로 인과가 확정되는 것은 아니므로 관련 자원 상태도 대조한다.
07인증 로그와 감사 로그
- 인증 기록인증 실패는 계정·접속지·인증 방식·대상 서비스와 함께 해석한다. 한 사람의 로그인 동작이 여러 PAM·SSH 기록을 만들 수 있어 실패 줄 수를 시도 횟수로 곧바로 환산하지 않는다.
- 로그인 이후인증 성공 기록도 그 뒤의 모든 파일 접근이 허가되었다는 뜻은 아니다.
- 감사 식별자감사 자료는 행위·객체·주체·성공 여부를 더 자세히 다룰 수 있다. 현재 uid와 원래 로그인 사용자 auid가 다르면 권한 전환의 문맥을 설명할 수 있다.
- Serial 연결여러 감사 레코드가 같은 serial로 하나의 이벤트를 구성할 수 있으므로 줄 단위 경보가 사건을 분해·중복하지 않도록 한다.
LEARN THROUGH PRACTICE
SSH 인증 로그와 서비스 로그를 사건 단위로 묶기
시간··세션 필드를 따라 로그 줄의 의미를 구분하고 원인을 과장하지 않는다.
실습 구성과 전제
- 로그 파일의 읽기 전용 작업 사본을 사용하고 원본 시각·시간대·해시를 기록한다.
- 서로 다른 가 섞인 출력은 화면 순서만으로 한 사건이라고 합치지 않는다.
인증과 세션의 서로 다른 메시지를 나눈다
- Accepted password는 인증 수락, opened는 세션 시작, closed는 세션 종료의 단서다. -logind의 세션 번호와 sshd PID를 연결해 순서를 좁힌다.
- 로그인 성공이 정당한 사용자였다는 의미는 아니다. 허가된 계정·출발지·시간 범위와 함께 조사한다.
원본 크기로 보기 ↗- sshd의 Accepted password·pam_unix session opened/closed와 logind 메시지가 같이 보인다.
- 각 줄에 PID와 Session 번호가 있어 한 화면 안에서도 서로 다른 세션을 분리할 수 있다.
확인 기준출발지 주소만 같다고 다른 PID의 사건을 하나로 합치지 않는다.
서비스 메시지의 주체를 먼저 확인한다
- 질의· 세션· 정리 작업이 섞인 에서는 프로그램 태그를 먼저 읽는다. grep 문자열 하나로 추출한 출력도 다른 프로그램의 줄을 포함할 수 있다.
- Started·Deactivated successfully는 서비스 수명주기 정보다. 그 자체를 침해나 장애로 분류하지 않는다.
shelljournalctl -u sshd --since '2026-06-01 00:00:00' --until '2026-06-02 00:00:00' --no-pager journalctl -u ssh --since today --no-pager배포판에 따라 서비스 이름은 sshd 또는 ssh다. 날짜는 자신의 시험 범위로 바꾼다.
원본 크기로 보기 ↗- named·systemd·phpsessionclean 메시지가 같은 시간축에 섞여 있다.
- 성공적으로 종료된 작업과 DNS 질의를 구분할 수 있다. 서로 인접한 줄이라는 이유만으로 인과관계를 만들면 안 된다.
확인 기준서비스별 시간 범위로 다시 조회해 앞선 오류와 후속 상태를 확인한다.
관찰 사실과 가설을 분리한다
- 보고서에는 '인증 수락 기록이 있다'와 '계정 탈취가 의심된다'를 구분해 쓴다. 후자는 계정 소유자 확인·접근 대상·후속 증거를 더 요구한다.
- 시각이 어긋나면 시간대와 시간 동기화 상태를 먼저 확인하고 원본 로그는 수정하지 않는다.
확인 기준한 문장마다 뒷받침하는 로그와 아직 확인되지 않은 조건을 남긴다.
실습에서 확인한 동작 원리
- 로그의 프로그램·PID·세션이 사건 묶음의 기준이다.
- 성공 메시지는 정상 사용자라는 보증이 아니며 종료 메시지는 공격 증거가 아니다.
설정·출력 추가로 확인하기 2장
아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.
실습 화면 묶음 01 1장
원본 크기로 보기 ↗- 「server ( access log)」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 로그 읽기 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 02 1장
원본 크기로 보기 ↗- 수업 원본 자료 · Linux와 웹 서비스 로그를 통한 상태·행위 관찰. 원문에서 「Linux 관리」에 배치된 그림 또는 화면이다.
08시간 동기화·수집 지연·순서
- 로그 시각은 사건 생성 장치의 시계에 의존한다. step·timezone 설정·연도 추정 문제가 있으면 실제 순서가 뒤바뀔 수 있다.
- 수집 지연과 을 함께 저장하면 전송 지연과 시계 차이를 조사할 근거가 생긴다.
- 정렬 한계같은 파일의 줄 순서도 여러 버퍼링과 비동기 출력 때문에 모든 실제 실행 순서를 완벽하게 보장하지 않는다. request ID· ID· 관계가 시간보다 강한 연결 키가 될 수 있다.
- 시간대 정규화여러 소스를 타임라인으로 합칠 때는 추정 오차를 남긴다.
원리 심화
09실시간 시계·부팅 내 시간·저널 식별자
- 실시간 시각사람이 읽는 날짜 시각은 시간대 변환· 보정·수동 변경의 영향을 받는다. 서로 다른 호스트의 같은 표시값도 정확히 동시라고 보장하지 않는다.
- Monotonic 시각저널의 __MONOTONIC_TIMESTAMP는 저널이 레코드를 수신한 부팅 내 시각이며 마이크로초 단위다. 자체나 다른 부팅의 값과 그대로 비교하지 않는다.
- Boot ID_BOOT_ID는 부팅 세션을 구분한다. 부팅 내 과 묶으면 재부팅 전후의 작은 숫자가 역순 사건으로 섞이는 일을 줄일 수 있다.
- Cursor저널 cursor는 특정 위치를 다시 찾는 불투명한 식별자다. 내부 문자열 형식을 임의 해석해 시간·일련번호로 사용하는 대신 제공 API를 따른다.
- 필드 신뢰밑줄로 시작하는 신뢰 필드는 저널이 부가한 실행 문맥이다. 애플리케이션 본문의 사용자명과 운영체제가 관찰한 UID를 별도 증거로 본다.
예제로 추적
10가상 재부팅 전후 로그의 순서 구성
- 첫 사건Boot A에서 monotonic=10초, 표시 시각=10:00:10에 서비스 종료가 기록되었다고 가정한다.
- 다음 사건재부팅 뒤 Boot B에서 monotonic=2초, 표시 시각=10:00:30에 서비스 시작이 기록된다.
- 잘못된 정렬monotonic 숫자만 정렬하면 2초가 10초보다 앞이므로 시작을 종료보다 먼저 놓게 된다. 서로 다른 기준점을 혼합한 오류다.
- 올바른 문맥Boot ID와 부팅 순서를 먼저 구분하고 각 부팅 안에서 monotonic 값을 비교한다. 전체 시각은 재부팅 기록·실시간 시각을 함께 사용한다.
- 불확실성 표시시계가 뒤로 조정된 구간에서는 표시 시각만으로 밀리초 순서를 확정하지 않는다. · 순서·요청 ID를 보조 증거로 남긴다.
검증·예외
11로그의 시각·주체가 서로 모순되는 경우
- 시간대 누락시간대 없는 문자열을 어느 지역 시각으로 파싱했는지 확인한다. 이미 인 값을 다시 변환하면 일정 시간 차이가 생긴다.
- 발생과 수집네트워크 지연·큐 적체가 있으면 수집 순서가 발생 순서와 달라진다. 두 시각을 같은 필드에 덮어쓰지 않는다.
- 신원 출처로그인 사용자·실효 UID·감사 auid·본문의 계정 문자열이 같은 의미인지 구분한다. 권한 상승 뒤 서로 달라질 수 있다.
- 원문 재확인파싱 실패나 줄바꿈 주입이 의심되면 원래 레코드 경계와 바이트를 확인한다. 검색 화면의 정규화 결과만을 원본으로 취급하지 않는다.
12원본 보존·중복·로그 주입
- 원본 보존정규화된 필드와 원본 메시지를 연결하면 파서 오류를 다시 검토할 수 있다. 단, 비밀번호·세션 토큰 등 불필요한 비밀을 처음부터 로깅하지 않는 것이 후처리 마스킹보다 중요하다.
- 로그 주입사용자가 입력한 줄바꿈·제어 문자가 새 로그처럼 보이게 하면 기록의 구조가 훼손될 수 있다.
- UI 출력 경계 화면에서도 메시지를 HTML로 해석하지 않고 안전하게 표시해야 로그 안의 문자열이 코드가 되지 않는다. 로컬과 원격 보관은 서로 다른 실패에 대비하지만 같은 사건의 중복 수집을 판별할 식별·출처 정보가 필요하다.
- 회전·중복회전·보존 정책이 달라 원본만 먼저 삭제되면 검색 결과에서 증거로 돌아갈 수 없게 된다.
13단계별로 누락 위치 찾기
- 전달 경로메시지가 애플리케이션에서 생성되었는지, 이나 파일에 남았는지, 수집기가 읽었는지, 중앙에서 파싱되었는지, 시간 필터 안에 있는지를 차례로 연결한다. 중앙 검색 결과가 없다는 사실만으로 생성 장치가 기록하지 않았다고 결론 내리지 않는다.
- 단계별 건수source별 마지막 이벤트 시각, 파싱 실패, 읽기 권한, 파일 회전, 큐, 저장 오류는 모두 로그 경로의 상태다. 관제는 로그 안의 이상만 찾는 일이 아니라 로그가 없어진 이유를 관찰하는 일도 포함한다.
설명과 함께 보는 보조 도식
처리 과정
모식도 · 요청과 로그의 두 경로
업무 요청과 기록의 수집·해석을 구분한다.
01업무 서비스요청 처리와 결과 생성
02원본 로그시각·식별자·원래 메시지
03파서필드 추출·자료형 검사
04검색 저장소정규화 결과와 원본 참조
01
이벤트 생성
업무 결과를 필요한 필드와 함께 기록한다.
전체 단계를 한 번에 읽기
- 01
이벤트 생성
업무 결과를 필요한 필드와 함께 기록한다.
- 02
해석
시간대와 필드 의미를 보존해 추출한다.
- 실패
- 별도 실패 상태로 보존
- 03
저장
원본으로 돌아갈 수 있는 참조를 유지한다.
- 04
조사
발생 시각과 수신 시각을 구분해 연결한다.
- 정렬 기준
- 질문에 맞는 시간 필드
학습 확인
이해했는지 확인하기
- 발생·수신·저장 시각과 시간대가 구분되는지 확인한다.
- 요청 식별자로 접근·오류·인증 로그를 연결한다.
- 비밀값 제외와 파싱 실패·수집 중단 감시를 확인한다.