[Linux] 리눅스 기본 보안

[Linux] 리눅스 기본 보안


Linux Security

부트로더 보안

리눅스 실행 과정

  • 사용자 전원 On -> 하드웨어 초기화 (BIOS) -> 부트로더 실행 (GRUB) -> 선택된 커널 실행 -> Runlevel에 따라 프로그램 실행
    • 리눅스가 부팅될 때 BIOS에서 하드웨어를 인식하고 초기화
    • 하드웨어에 문제가 없으면 부트로더를 RAM에 로드하고 부트로더를 실행
    • 부트로더는 부팅에 필요한 리눅스 커널을 로드
    • 리눅스의 init 프로세스가 시작되며 리눅스 프로그램 실행
  • 과거에는 LILO를 많이 사용했지만 현재는 네트워크 부팅 기능과 커맨드 환경 등 사용자 편의성이 개선된 GRUB 사용
  • GRUB 보안이 취약하다면 서버에 보안 조치가 되어 있어도 시스템에 접근하거나 악성 코드를 실행할 수 있으므로 부트로더 보안 조치는 필수

취약점

  • 부팅 시 esc를 누르면 GRUB 선택 화면
  • 부팅하고 싶은 커널을 선택하거나, e를 눌러 부팅되는 커널의 설정값을 변경 가능
  • root 비밀번호를 잊어버렸다면 싱글 모드(Runlevel 1)로 접근해 passwd 명령으로 root 비밀번호 변경 가능
  • 이 점을 이용해 공격자가 서버에 접근해 재부팅한 후 GRUB 설정을 변경해 싱글 모드로 부팅하면 root 비밀번호를 변경할 수 있음

해결 방법

  • GRUB 비밀번호 기능을 설정

GRUB 비밀번호 설정 방법

  1. GRUB의 암호화된 비밀번호 (Hash) 생성
  2. 해당 비밀번호와 계정명을 GRUB 환경 설정 파일에 삽입 (/etc/grub.d/00_header)
  3. GRUB의 변경된 설정 적용 (update-grub)

사용자 계정 보안

  • 리눅스 서버 운영 시 보안이 가장 취약한 부분

사고 / 공격 유형

  • 무차별 대입 (사전 대입) 공격
    • 비밀번호를 무작위로 입력해 사용자 또는 시스템 계정의 비밀번호를 알아내는 방법
  • 시스템 계정의 유출
    • root 사용자의 비밀번호를 획득
    • 각종 사용자의 정보를 탈취해 서비스 중단을 야기할 수 있음
  • 파일 및 디렉터리의 변조와 유출
    • 서버 내에 저장된 데이터를 변조하거나 유출하는 방법
    • 개인 정보 혹은 금융 정보가 노출되는 문제를 일으킬 수 있음

사용자 계정 보안 설정

  • 리눅스 시스템의 사용자 계정
    • root: 최고 권한
    • 일반 사용자
      • 서비스 관리용 특수 계정: 콘솔 로그인이 필요 없음
      • 일반 사용자: 콘솔 로그인 필요
  • 사용자 계정 유출로 인한 시스템 접근을 막으려면 불필요한 사용자의 로그인을 제한해야 함

사용자 계정 관리하기

  • sudo passwd -S <account name>으로 계정 상태 확인
    • P: 비밀번호가 설정된 상태
    • L: 계정이 잠긴 상태
    • 사용자가 더 이상 사용하지 않는다면 sudo usermod -L <account name>으로 사용자 계정 잠그기
      • sudo usermod -U <account name>으로 잠금 해제

사용자 로그인 제한

  • 서비스 관리용 특수 계정의 경우 로그인 자체를 허용하면 안 됨
    • 특수 계정은 일반 사용자가 파일을 생성하고 조작하기 위해 사용하는 계정이 아니라 서비스에서 권한을 주고 자동으로 실행하기 위해 사용하는 계정
  • sudo cat /etc/passwd로 사용자 계정 확인 시 /sbin/nologin으로 되어있는 것은 로그인이 불가능한 특수 계정
  • 특수 계정을 sudo usermod -s /usr/sbin/nologin <account name>으로 로그인 불가능 상태로 만들기

비밀번호 정책 설정

  • 무차별 대입 공격으로 인한 사용자 계정 탈취를 막기 위한 효과적인 방법
  • /etc/login.defs 파일에 설정
    • Password agin controls 부분에 사용자 계정의 비밀번호, 유효 기간, 최소 길이 제한을 설정
비밀번호 정책설명
PASS_MAX_DAYS비밀번호 최대 유효 기간
PASS_MIN_DAYS비밀변호 변경 후 다시 변경할 때까지 필요한 최소일
PASS_MIN_LEN비밀번호 최소 길이
PASS_WARN_AGE비밀번호 만료일 이전 경고 표시

참고: su 명령 인증 정책

상황인증 정책
root -> 일반 사용자비밀번호를 묻지 않고 바로 전환
일반 사용자 -> 일반 사용자변경하는 사용자의 비밀번호를 확인한 후 인증
일반 사용자 -> rootroot 비밀번호를 확인한 후 인증

방화벽

  • 불법으로 외부에서 침입하는 것을 차단하고 내부에서 정보가 유출되는 것을 방지하는 침입 차단 시스템
  • 외부에서 들어오는 패킷인 Inbound, 내부에서 나가는 패킷인 Outbound에 대한 정책을 설정해 패킷을 허가하거나 거부하는 방식으로 작동
  • 종류
    • Appliance: 네트워크에 별도의 장비를 구성하는 방식
    • Application Firewall: 리눅스 서버 내에 서비스 형태로 구성된 방식

리눅스 방화벽

  • 구성
    • 방화벽 처리부: 리눅스 커널을 제어해 실제 네트워크 패킷을 필터링
    • 방화벽 제어부: 필터링 정책을 추가 / 제거
  • ufw (Uncomplicated Firewall): 데미안 리눅스 기반 방화벽 시스템, 우분투도 사용
  • firewalld: 레드햇 리눅스가 사용

방화벽 정책 설정

  1. sudo ufw status (verbose): 상태 확인
  2. sudo ufw enable: 활성화
  3. sudo ufw disable: 비활성화

방화벽 정책 추가 / 삭제

  • 서비스 단위(HTTP, SSH), 혹은 포트 단위(22/tcp)로 설정 가능
  1. sudo ufw <allow or deny> <service or port/tcp or udp>
  2. sudo ufw delete <allow or deny> <service or port/tcp or udp>
  3. sudo ufw allow from <ip address> to any <port or service>

PAM을 활용한 사용자 계정 보안

  • PAM: Pluggable Authentication Modules
  • 리눅스에서 사용자 인증을 담당하는 모듈

접근 제어 흐름

  1. 로그인 시도
  2. PAM이 /etc/pam.d에 있는 서비스별 구성 파일(로그인의 경우 system-auth)을 확인
  3. PAM 모듈에 사용자 신원 확인, 비밀번호 일치 여부 등을 요청
  4. 결과가 일치하면 로그인을 허용

PAM의 구성

  • /etc/pam.d 디렉터리 밑에 제어하고자 하는 애플리케이션 (명령어) 또는 서비스에 해당하는 구성 파일을 만들어 제어
  • 구성 파일은 총 네 가지

모듈 타입

  • 어떤 종류의 인증을 사용할 것인지 지정하는 필드
모듈설명
authentication module비밀번호, 공개 키를 이용해 사용자의 신원을 확인
account module계정 만료, 시간, 특정 서비스 접근 권한 등 인증 조건을 검사
password module비밀번호 갱신, 비밀번호 복잡도 등을 설정
session module사용자 세션의 시작부터 끝까지 가능한 작업을 정의하는 모듈

Control Flag

Control Flag결과설명
required성공최종 인증 결과는 무조건 성공
실패최종 인증 결과가 무조건 실패
requisite성공다음 인증 모듈 실행
실패인증 실패 결과를 즉시 반환
sufficient성공인증 성공 결과를 즉시 반환
실패다음 인증 모듈을 실행
include (@include)성공다른 PAM 구성 파일을 호출
실패다른 PAM 구성 파일을 호출
optional성공인증 결과에 반영되지 않으나 다른 인증 모듈의 결과가 없다면 모듈 결과를 반환
실패인증 결과에 반영되지 않으나 다른 인증 모듈의 결과가 없다면 모듈 결과를 반환
substackinclude와 비슷하지만 인증 결과 값에 따라 동작이 달라짐

PAM 모듈

  • 구성 파일에서 PAM 인증 모듈을 선택하는 부분
  • 원하는 인증 기능을 선택 가능
    • pam_rootok: root 계정인 경우 추가 인증 없이 무조건 허용
    • pam_wheel.so: su 명령어 사용 인증, 특정 그룹(wheel)에 대한 인증 제어
    • 등등

Module Arguments

  • 모듈이 갖고 있는 설정값을 추가로 지정할 때 사용
  • Debug: 시스템 로그 파일에 로그를 남김

PAM의 보안 설정하기

  1. ls /etc/pam.d를 입력해 PAM 구성 파일 확인
  2. 여러 파일을 cat으로 확인해보기
sbae@ip-192-168-100-11:~$ sudo cat /etc/pam.d/su
#
# The PAM configuration file for the Shadow `su' service
#

# This allows root to su without passwords (normal operation)
auth       sufficient pam_rootok.so

# Uncomment this to force users to be a member of group wheel
# before they can use `su'. You can also add "group=foo"
# to the end of this line if you want to use a group other
# than the default "wheel" (but this may have side effect of
# denying "root" user, unless she's a member of "foo" or explicitly
# permitted earlier by e.g. "sufficient pam_rootok.so").
# (Replaces the `SU_WHEEL_ONLY' option from login.defs)
# auth       required   pam_wheel.so

# Uncomment this if you want wheel members to be able to
# su without a password.
# auth       sufficient pam_wheel.so trust

# Uncomment this if you want members of a specific group to not
# be allowed to use su at all.
# auth       required   pam_wheel.so deny group=nosu

# Uncomment and edit /etc/security/time.conf if you need to set
# time restrainst on su usage.
# (
![](https://i.imgur.com/Y2mPBWV.jpeg)
Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs
# as well as /etc/porttime)
# account    requisite  pam_time.so

# This module parses environment configuration file(s)
# and also allows you to use an extended config
# file /etc/security/pam_env.conf.
#
# parsing /etc/environment needs "readenv=1"
session       required   pam_env.so readenv=1
# locale variables are also kept into /etc/default/locale in etch
# reading this file *in addition to /etc/environment* does not hurt
session       required   pam_env.so readenv=1 envfile=/etc/default/locale

# Defines the MAIL environment variable
# However, userdel also needs MAIL_DIR and MAIL_FILE variables
# in /etc/login.defs to make sure that removing a user
# also removes the user's mail spool file.
# See comments in /etc/login.defs
#
# "nopen" stands to avoid reporting new mail when su'ing to another user
session    optional   pam_mail.so nopen

# Sets up user limits according to /etc/security/limits.conf
# (Replaces the use of /etc/limits in old login)
session    required   pam_limits.so

# The standard Unix authentication modules, used with
# NIS (man nsswitch) as well as normal /etc/passwd and
# /etc/shadow entries.
@include common-auth
@include common-account
@include common-session
© 2024 Seungwon Bae 🇰🇷