서버 네 대를 세우면서 계정을 만들었다. 편하려고 네 대에 같은 계정을 다 만들었다.
Table of contents
Open Table of contents
전부 같게 만들었다
이렇게 만들었다.
# 네 대 모두
useradd deploy
useradd batch
useradd monitor
useradd dev1
useradd dev2
한 번 만들어 두면 어디서든 붙을 수 있어서 편했다. 몇 달 뒤 파일 서버에서 이상한 접속 기록을 봤다.
$ last | head
dev2 pts/0 web01 Mon Jun 15 22:14
dev2 가 파일 서버에 붙은 기록이었다. 거기서 할 일이 없는 계정이었다.
어디에 무엇이 필요한지 적어 봤다.
웹 DB 파일 배치
deploy O - - O
batch - - - O
monitor O O O O
dev1/dev2 O - - -
db_admin - O - -
deploy 와 batch 와 monitor 가 필요한 자리가 각각 달랐고 전부 만들 이유가 없었다. 계정 하나가 새어 나가면 네 대가 한꺼번에 열리는 상태이기도 했다.
지우기 전에 무엇을 하는지 봤다
userdel 하려다 멈추고 그 계정이 무엇을 하고 있는지 먼저 봤다.
$ ps -u dev2
$ crontab -u dev2 -l
$ find / -user dev2 2>/dev/null | head
ps -u 에 도는 것이 없고 find -user 에 파일도 없으면 지웠다.
$ userdel -r dev2
crontab -u 로 보니 배치가 그 계정으로 도는 것이 있었다. 지웠으면 그 배치가 멈췄을 것이다.
파일이 있는 계정도 바로 안 지웠다. batch 계정은 파일 서버에 파일을 갖고 있어서 못 지웠고 대신 로그인을 막았다.
$ usermod -s /sbin/nologin batch
$ passwd -l batch
/sbin/nologin 이면 파일 소유자로는 남아 있고 접속은 안 된다. passwd -l 로 비밀번호도 잠가서 키로만 붙게 두는 것과 아예 못 붙게 하는 것을 나눴다.
붙는 방법의 구분
붙는 방법도 계정마다 나눴다.
deploy 키로만. 비밀번호 로그인 금지
dev1 키로만. 웹 서버에만
monitor 키로만. 명령 제한
monitor 는 확인만 하면 되므로 할 수 있는 것을 좁혔다.
# authorized_keys
command="/usr/local/bin/check-status.sh",no-port-forwarding ssh-rsa AAAA...
command= 를 주면 붙었을 때 그 스크립트만 돌고 끝난다. 셸이 안 열린다.
사람이 붙는 계정과 프로그램이 쓰는 계정도 나눴다. 둘을 섞어 두면 누가 무엇을 했는지 기록으로 가를 수 없다.
조치 — 만들 때 적고 정기적으로 봤다
만들 때 왜 만드는지 적는 자리를 뒀다.
계정 용도 필요한 서버 만든 날 만든 사람
deploy 배포 스크립트 실행 웹, 배치 2014-03-02 ...
monitor 상태 확인 전체 2014-03-02 ...
적어 두니 나중에 이거 지워도 되느냐는 물음에 답할 수 있었다. 그리고 사람이 나갈 때 어디서 지워야 하는지가 이 표로 갈린다.
정기적으로 훑는 것도 넣었다.
#!/bin/sh
# 90일 넘게 접속 안 한 계정
for u in $(awk -F: '$3>=1000 {print $1}' /etc/passwd); do
last -1 "$u" | head -1
done
/etc/passwd 에서 uid 1000 이상만 골라 last 를 보게 했다. 한 번 만들고 잊으면 계속 남으므로 분기에 한 번 훑기로 했다. 첫 번에 여섯 개가 나왔고 넷은 지웠으며 둘은 이유가 있어 남기고 그 이유도 표에 적었다.
계정마다 권한을 따로 주니 새 사람이 올 때마다 네 대를 다 손대야 했다.
$ groupadd developers
$ usermod -aG developers dev1
# sudoers
%developers ALL=(ALL) /usr/bin/tail, /usr/bin/less
usermod -aG 로 그룹에 넣기만 하면 되고 빼는 것도 한 번이다. 전에는 나간 사람의 권한이 한 대에만 남아 있는 일이 있었는데 네 대를 각각 손대다 하나를 빠뜨린 것이었다.
정리
- 편하려고 전부 같게 만들면 필요 없는 곳까지 열린다
- 어디에 무엇이 필요한지 표로 적어 본다
- 지우기 전에 그 계정이 무엇을 하고 있는지 본다
crontab -u로 배치가 쓰는 계정인지 본다- 못 지우는 것은
/sbin/nologin으로 로그인만 막는다. 소유자로는 남는다 - 확인만 하면 되는 계정은
authorized_keys의command=로 좁힌다 - 사람 계정과 프로그램 계정을 나눈다
- 만들 때 왜 만드는지 적는다. 나중에 지워도 되는지가 그것으로 갈린다
- 정기적으로 훑는다. 한 번 만들고 잊으면 계속 남는다
- 같은 권한이 여럿에게 필요하면
groupadd로 묶어 다룬다