011. Linux 서버 보안 — SSH 접근 제어 — AllowUsers·AllowGroups·Match

changseop lee·5일 전

시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 11/50편 (전체 011/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.

선행 학습

1. 개념

SSH 접근 제어는 "인증을 시도할 자격" 자체를 제한하는 설정입니다. 비밀번호가 맞더라도 허용 목록에 없으면 로그인할 수 없습니다.

접속 요청 (user, 출발지 IP)
      ↓
DenyUsers → AllowUsers → DenyGroups → AllowGroups  (이 순서로 평가)
      ↓ 통과
Match 블록 조건(User/Group/Address) → 조건별 정책 적용
      ↓
인증 (publickey / password)

AllowUsers user@IP 형식을 쓰면 계정과 출발지를 함께 묶을 수 있습니다.

2. 왜 중요한가

  • 서버에는 서비스 계정, 테스트 계정 등 SSH가 필요 없는 계정이 많습니다. 허용 목록이 없으면 이 모든 계정이 공격 대상이 됩니다.
  • 계정 탈취가 일어나도 허용 출발지 밖에서는 접속할 수 없어 피해 범위가 줄어듭니다.
  • 거부 로그는 "존재하지만 허용되지 않은 계정"을 노린 시도를 보여주므로, 내부 정보를 아는 공격자를 구분하는 단서가 됩니다.

3. 핵심 명령어 / 설정

설정예시의미
AllowGroupsAllowGroups sshusers그룹 단위 허용(운영 권장)
AllowUsersAllowUsers admin1@192.168.56.0/24계정 + 출발지 대역
DenyUsersDenyUsers apache mysql명시적 거부
Match AddressMatch Address 192.168.56.0/24대역별 정책(예: 내부만 password 허용)

AllowUsers와 AllowGroups를 함께 쓰면 둘 다 만족해야 접속됩니다. 운영에서는 하나만 선택해 혼란을 줄이는 것이 좋습니다.

4. 실습 (실습 예시)

# 1) SSH 허용 그룹 생성 및 관리자 추가
sudo groupadd sshusers
sudo usermod -aG sshusers admin1

# 2) drop-in으로 접근 제어 적용
sudo tee /etc/ssh/sshd_config.d/05-access.conf <<'EOF'
AllowGroups sshusers
Match Address 192.168.56.0/24
    PasswordAuthentication no
EOF
sudo sshd -t && sudo systemctl reload sshd

# 3) 실효값 확인
sudo sshd -T | grep -i allowgroups
sudo sshd -T -C user=testuser,host=x,addr=192.168.56.50 | grep -E 'allowgroups|passwordauthentication'

5. 정상 상태

$ sudo sshd -T | grep -i allowgroups
allowgroups sshusers
$ getent group sshusers
sshusers:x:1005:admin1

허용 그룹 구성원이 관리자 명단과 일치하고, 그룹 변경 이력이 변경관리 기록과 맞는 상태가 정상입니다.

6. 이상 상태

$ getent group sshusers
sshusers:x:1005:admin1,apache,backup
  • 서비스 계정 apache와 용도 불명의 backup이 허용 그룹에 추가됨
  • 접근 제어 설정은 그대로여도 그룹 구성원만 바꾸면 우회가 가능합니다. 설정 파일과 함께 /etc/group도 감시해야 하는 이유입니다.

7. 로그 분석 (분석 방법)

허용 목록에 없는 계정의 접속은 인증 전에 거부됩니다(가상의 예시 로그).

Oct  1 06:02:11 rocky9-web01 sshd[6301]: User testuser from 192.168.56.50 not allowed because none of user's groups are listed in AllowGroups
Oct  1 06:02:11 rocky9-web01 sshd[6301]: Connection closed by invalid user testuser 192.168.56.50 port 51022 [preauth]
Oct  1 06:05:40 rocky9-web01 usermod[6355]: add 'apache' to group 'sshusers'
Oct  1 06:06:02 rocky9-web01 sshd[6370]: Accepted password for apache from 192.168.56.50 port 51088 ssh2
시각이벤트해석
06:02허용 그룹 아님 → 거부접근 제어 정상 동작
06:05apache를 허용 그룹에 추가우회 준비(권한 있는 세션 필요)
06:06apache 로그인 성공같은 출발지 IP → 동일 행위자 가능성 높음

허용되지 않은 사용자는 sshd 로그에 invalid user로 표시되므로 존재하지 않는 계정 시도와 구분하려면 앞 줄의 not allowed because 메시지를 함께 봐야 합니다.

8. SOC 관제 포인트

  • not allowed because 로그는 실존 계정을 아는 시도일 가능성이 있어 단순 무작위 대입보다 우선순위를 높입니다.
  • 허용 그룹 구성원 변경(usermod -aG, gpasswd -a)은 접근 제어 설정 변경과 동급으로 다룹니다.
  • 서비스 계정의 SSH 로그인 성공은 거의 항상 비정상입니다.

9. 탐지 규칙

<group name="local,ssh_access,">
  <rule id="100180" level="6">
    <decoded_as>sshd</decoded_as>
    <match>not allowed because</match>
    <description>SSH 접근 제어 정책에 의한 거부</description>
  </rule>
  <rule id="100181" level="11">
    <if_sid>5715</if_sid>
    <user>^apache$|^nginx$|^www-data$|^mysql$|^postgres$</user>
    <description>서비스 계정 SSH 로그인 성공</description>
  </rule>
</group>

10. 대응 방법

  1. 초기 확인 — 거부·성공 로그의 계정, 출발지 IP, 시간 순서를 정리합니다.
  2. 범위 확인 — 같은 IP의 다른 서버 접근과 허용 그룹 변경 이력을 확인합니다.
  3. 증거 확보 — /etc/group 사본, sshd 설정 사본, secure/auth.log를 보존합니다.
  4. 차단/조치 — 비인가 구성원을 그룹에서 제거하고 해당 세션을 종료합니다.
  5. 재발 방지 — 허용 그룹 구성원을 기준선에 포함하고 그룹 변경을 감시합니다.

11. 핵심 정리

구분핵심 내용
평가 순서DenyUsers → AllowUsers → DenyGroups → AllowGroups
권장 방식AllowGroups 단일 사용 + 그룹 구성원 관리
우회 포인트설정이 아니라 그룹 구성원 변경
거부 로그not allowed because ... listed in AllowUsers/AllowGroups
면접 포인트"접근 제어 설정과 그룹 파일을 함께 감시"

12. 다음 편 예고

다음 편 012. Linux 서버 보안 — SSH 세션·인증 시도 제한 설정 에서는 무차별 대입과 방치된 세션을 줄이는 SSH 세션·인증 시도 제한 설정을 다룹니다.


이전 편: 010. Linux 서버 보안 — SSH 암호 알고리즘·KEX 설정 점검
📚 시리즈 전체 보기: 시스템 보안 · 취약점

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글