제가 일하는 곳에서는 보안 및 감사 목적으로 각 세션(파일 이름의 사용자, 날짜, 터미널 등)에 대한 기록 파일을 보관해야 합니다.
분명히 HISTFILE
변수는 읽기 전용( readonly HISTFILE
)으로 설정되어 있으므로 일반 사용자는 다른 히스토리 파일을 설정할 수 없습니다(루트나 변경 모두 아님 /etc/profile
).
이것이 우리가 가진 것입니다 /etc/profile
:
EXTENDED_HISTORY=ON
readonly EXTENDED_HISTORY
export EXTENDED_HISTORY
HISTFILE=$HOME/.history/`date +%y%m%d.%H%M%S`.${WHO_USER:-user}.${WHO_TERMINAL:-term}.${SSH_PORT:-port}.${MY_PID:-pid}
readonly HISTFILE
export HISTFILE
가장 큰 문제는 이전 파일을 greping하지 않고는 이전 명령을 검색할 수 없다는 것입니다.
감사를 유지하면서 여러 세션 간에 명령 기록을 공유할 수 있는 간단한 해결 방법이나 더 나은 솔루션이 있습니까?
우리는 ksh와 bash를 사용합니다.
답변1
쉘 기록 파일은 명령을 감사하는 좋은 방법입니다. 사용자는 이를 쉽게 수정하거나 우회할 수 있습니다. 이는 사용자가 의도적으로 또는 실수로 중재 메커니즘을 우회하지 않을 것이라고 신뢰하는 경우에만 유용합니다. 예를 들어 GUI, 편집기 등에서 실행된 명령은 이 방식으로 기록되지 않습니다. 사용자가 문서화되지 않은 명령을 시작하는 방법은 여러 가지가 있으며 의도적으로 보안 조치를 우회하려고 시도하는 것이 아니라 편의상 또는 인식하지 못한 채 명령을 수행하고 있다는 사실을 그럴듯하게 부인할 수도 있습니다.
기록 파일을 추가 전용으로 설정하면( chattr +a
기록 파일을 루트로 실행해야 함) 기록된 모든 내용이 기록되지만 기록은 여전히 쉽게 우회할 수 있습니다.
별도의 이력 파일을 보관할 수 없습니다.단일 기록 파일 유지그리고 정기적으로 백업하세요. 이렇게 하면 명령이 실행된 날짜가 보존되지만 터미널은 보존되지 않습니다.
로그가 실행된 명령과 일치하는지 확인해야 한다면 셸 기록 파일은 잘못된 도구입니다. 대신 감사 데몬을 사용하세요. 모든 통화를 기록하도록 구성합니다 execve
.
auditctl -A exit,always -S execve
자세한 내용은 다음 질문을 참조하세요.
답변2
귀하가 요청하는 내용이 100% 확실하지는 않지만 각 세션에 대한 개별 기록을 얻는 방법은 다음과 같습니다. 기본적으로 호스트와 pty를 기준으로 이름이 지정됩니다. 이것은 배쉬를 위한 것입니다.
# Unique history file per shell session.
HISTSIZE=300
HISTFILE=$HOME/.bash_hist_${HOSTNAME/.*/}_$(basename $(tty))
SAVEHIST=500
export HISTCONTROL=ignoredups
이것은 ~/.bashrc
파일에 있습니다. HISTFILE을 변경할 수 없다는 것이 무슨 뜻인지 이해가 되지 않습니다.
한 가지 단점은 어떤 세션 기록을 얻게 될지 예측할 수 없다는 것입니다. 그러나 감사하려면 전체 세트를 grep할 수 있습니다.
grep something ~/.bash_hist_*
그러나 세션 컨텍스트를 별도의 파일에 저장합니다.