사용자 전원 On -> 하드웨어 초기화 (BIOS) -> 부트로더 실행 (GRUB) -> 선택된 커널 실행 -> Runlevel에 따라 프로그램 실행
리눅스가 부팅될 때 BIOS에서 하드웨어를 인식하고 초기화
하드웨어에 문제가 없으면 부트로더를 RAM에 로드하고 부트로더를 실행
부트로더는 부팅에 필요한 리눅스 커널을 로드
리눅스의 init 프로세스가 시작되며 리눅스 프로그램 실행
과거에는 LILO를 많이 사용했지만 현재는 네트워크 부팅 기능과 커맨드 환경 등 사용자 편의성이 개선된 GRUB 사용
GRUB 보안이 취약하다면 서버에 보안 조치가 되어 있어도 시스템에 접근하거나 악성 코드를 실행할 수 있으므로 부트로더 보안 조치는 필수
취약점
부팅 시 esc를 누르면 GRUB 선택 화면
부팅하고 싶은 커널을 선택하거나, e를 눌러 부팅되는 커널의 설정값을 변경 가능
root 비밀번호를 잊어버렸다면 싱글 모드(Runlevel 1)로 접근해 passwd 명령으로 root 비밀번호 변경 가능
이 점을 이용해 공격자가 서버에 접근해 재부팅한 후 GRUB 설정을 변경해 싱글 모드로 부팅하면 root 비밀번호를 변경할 수 있음
해결 방법
GRUB 비밀번호 기능을 설정
GRUB 비밀번호 설정 방법
GRUB의 암호화된 비밀번호 (Hash) 생성
해당 비밀번호와 계정명을 GRUB 환경 설정 파일에 삽입 (/etc/grub.d/00_header)
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 -> 일반 사용자
비밀번호를 묻지 않고 바로 전환
일반 사용자 -> 일반 사용자
변경하는 사용자의 비밀번호를 확인한 후 인증
일반 사용자 -> root
root 비밀번호를 확인한 후 인증
방화벽
불법으로 외부에서 침입하는 것을 차단하고 내부에서 정보가 유출되는 것을 방지하는 침입 차단 시스템
외부에서 들어오는 패킷인 Inbound, 내부에서 나가는 패킷인 Outbound에 대한 정책을 설정해 패킷을 허가하거나 거부하는 방식으로 작동
종류
Appliance: 네트워크에 별도의 장비를 구성하는 방식
Application Firewall: 리눅스 서버 내에 서비스 형태로 구성된 방식
리눅스 방화벽
구성
방화벽 처리부: 리눅스 커널을 제어해 실제 네트워크 패킷을 필터링
방화벽 제어부: 필터링 정책을 추가 / 제거
ufw (Uncomplicated Firewall): 데미안 리눅스 기반 방화벽 시스템, 우분투도 사용
firewalld: 레드햇 리눅스가 사용
방화벽 정책 설정
sudo ufw status (verbose): 상태 확인
sudo ufw enable: 활성화
sudo ufw disable: 비활성화
방화벽 정책 추가 / 삭제
서비스 단위(HTTP, SSH), 혹은 포트 단위(22/tcp)로 설정 가능
sudo ufw <allow or deny> <service or port/tcp or udp>
sudo ufw delete <allow or deny> <service or port/tcp or udp>
sudo ufw allow from <ip address> to any <port or service>
PAM을 활용한 사용자 계정 보안
PAM: Pluggable Authentication Modules
리눅스에서 사용자 인증을 담당하는 모듈
접근 제어 흐름
로그인 시도
PAM이 /etc/pam.d에 있는 서비스별 구성 파일(로그인의 경우 system-auth)을 확인
PAM 모듈에 사용자 신원 확인, 비밀번호 일치 여부 등을 요청
결과가 일치하면 로그인을 허용
PAM의 구성
/etc/pam.d 디렉터리 밑에 제어하고자 하는 애플리케이션 (명령어) 또는 서비스에 해당하는 구성 파일을 만들어 제어
구성 파일은 총 네 가지
모듈 타입
어떤 종류의 인증을 사용할 것인지 지정하는 필드
모듈
설명
authentication module
비밀번호, 공개 키를 이용해 사용자의 신원을 확인
account module
계정 만료, 시간, 특정 서비스 접근 권한 등 인증 조건을 검사
password module
비밀번호 갱신, 비밀번호 복잡도 등을 설정
session module
사용자 세션의 시작부터 끝까지 가능한 작업을 정의하는 모듈
Control Flag
Control Flag
결과
설명
required
성공
최종 인증 결과는 무조건 성공
실패
최종 인증 결과가 무조건 실패
requisite
성공
다음 인증 모듈 실행
실패
인증 실패 결과를 즉시 반환
sufficient
성공
인증 성공 결과를 즉시 반환
실패
다음 인증 모듈을 실행
include (@include)
성공
다른 PAM 구성 파일을 호출
실패
다른 PAM 구성 파일을 호출
optional
성공
인증 결과에 반영되지 않으나 다른 인증 모듈의 결과가 없다면 모듈 결과를 반환
실패
인증 결과에 반영되지 않으나 다른 인증 모듈의 결과가 없다면 모듈 결과를 반환
substack
include와 비슷하지만 인증 결과 값에 따라 동작이 달라짐
PAM 모듈
구성 파일에서 PAM 인증 모듈을 선택하는 부분
원하는 인증 기능을 선택 가능
pam_rootok: root 계정인 경우 추가 인증 없이 무조건 허용
pam_wheel.so: su 명령어 사용 인증, 특정 그룹(wheel)에 대한 인증 제어
등등
Module Arguments
모듈이 갖고 있는 설정값을 추가로 지정할 때 사용
Debug: 시스템 로그 파일에 로그를 남김
PAM의 보안 설정하기
ls /etc/pam.d를 입력해 PAM 구성 파일 확인
여러 파일을 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 hurtsession 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 usersession 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