[42 Seoul] born2beroot - 과제 정리

현톨·2022년 9월 16일
0

42 서울 기록하기

목록 보기
1/8
post-thumbnail

서브젝트 요구사항

최신버전의 데비안과 CentOS 중에 선택한다. 처음이라면 데비안을 추천한다.

  • CentOS는 설치가 매우 복잡하므로 KDump를 세팅할 필요는 없다. 하지만 시작 시, SELinux는 실행되어야하며 과제에서 요구하는 설정이 적용되어야 한다. 데비안이라면 시작 시, AppArmor가 실행되어야 한다.
  • LVM을 사용하여 최소 2개 이상의 암호화된 파티션을 만들어야 한다.

aptitude와 apt의 차이점에 대해 알고있어야 하며, SELinux 혹은 AppArmor가 무엇인지 알고 있어야 한다.

  • SSH 서비스는 오직 4242 port에서만 실행되며, root에서 SSH를 사용하여 연결하는 것은 보안상의 이유로 금지된다.

동료 평가 중에 새 계정을 생성하여 SSH를 테스트 할 것이기 때문에 작동 원리를 이해하고 있어야 한다.

  • UFW 방화벽을 통해 OS를 설정해야한다. 그리므로 오직 4242 port만 열어두어야 한다.

당신의 방화벽은 가상머신을 실행시킬 때 활성화 되어야 한다. CentOS라면 기본 방화벽 대신 UFW방화벽을 사용해야한다. 이 때 DNF가 필요할 것이다.

  • 가상머신의 hostname은 login id 끝에 42가 붙어야 한다. (ex: hyuncpar42) 동료평가 중간에 hostname을 수정해야한다
  • 엄격한 암호 정책을 시행해야 한다.
  • 엄격한 규칙에 따라 sudo를 설치하고 설정해야한다.
  • root 계정 외에, 당신의 username인 계정이 존재해야한다.(ex: hyuncpar)
  • 해당 유저는 user42와 sudo 그룹에 포함된다.

평가 도중 새로운 계정을 만들고 그룹에 포함시켜야 한다.

  • 엄격한 패스워드 정책을 설정하기 위해 다음의 요구사항을 따라야 한다.
    • 패스워드는 30일마다 만기되어야 한다.
    • 패스워드는 최소 2일이 지나야 수정할 수 있다.
    • 패스워드 만기 7일 전에, 경고 메시지를 받아야 한다.
    • 최소 10글자 이상이어야 하며, 대문자, 소문자, 숫자를 포함시켜야 한다. 또한 같은 문자를 연속해서 3 글자 이상 사용할 수 없다.
    • 패스워드에 유저 이름이 포함되지 않아야 한다.
    • 다음은 root 패스워드에 적용되지 않는다.
      • 패스워드는 이전 패스워드와 최소 7글자 이상 달라야 한다.
    • 물론 root 패스워드에도 이러한 정책들을 적용시켜야 한다.

설정파일을 설정한 후에 root 계정을 포함한 가상머신 내 모든 계정의 비밀번호를 변경해야한다.

  • 당신의 sudo 그룹을 엄격하게 설정하기 위해 다음과 같은 요구사항을 따라야 한다.
    • 잘못된 패스워드 인증 시도는 3회까지만 제한된다.
    • sudo를 사용할 때, 잘못된 패스워드 에러 발생 시 커스텀 메시지를 출력해야한다.
    • sudo를 사용하는 모든 입출력 동작은 기록되어야 한다. 로그파일은 /var/log/sudo/ 폴더에 저장되어야 한다.
    • 보안상의 이유로 TTY 모드를 활성화해야 한다.
    • 역시 보안상의 이유로 sudo에서 사용가능한 경로는 다음과 같이 제한된다.(/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin)
  • 마지막으로 bash로 작성된 간단한 monitoring.sh를 생성해야한다.
  • 서버 시작 시, 해당 스크립트는 10분 주기로 터미널에 몇가지 정보들을 출력한다. 배너는 선택사항이며, 에러가 발생해서는 안된다.
  • 스크립트는 다음과 같은 정보들을 항상 출력할 수 있어야 한다.
    • 운영체제의 아키텍처와 커널 버전.
    • 물리적 프로세서의 수
    • 논리적 프로세서의 수
    • 현재 사용가능한 RAM과 현재 RAM의 사용률 %
    • 현재 사용가능한 메모리와 현재 메모리의 사용률 %
    • 현재 프로세서의 사용률 %
    • 마지막으로 재부팅된 날짜 및 시간
    • LVM의 활성화 상태 여부
    • 활성된 연결의 수
    • 서버 IPv4 주소와 MAC주소
    • sudo로 실행된 명령어의 갯수

평가를 하면서 해당 스크립트의 원리에 대해 설명할 수 있어야 한다. 또한 파일을 수정하지 않고 중단시킬 수 있어야 한다. cron을 참고하자.

bonus 파트 요구사항

  • 다음과 같이 파티션을 설정한다.

  • lighttpd, MariaDB, PHP를 사용해 WordPress 웹사이트를 설정한다.

  • 유용하다고 생각되는 서비스를 선택하여 설정한다. 해당 이유도 설명할 수 있어야 한다. (NGINX, Apache2 제외)

bonus 파트는 mandantory가 PERFECT인 경우에만 평가된다. mandantory가 모두 처리되었고 오작동 없이 작동한다는 것을 의미한다. 필수 요건을 모두 통과하지 않은 경우 보너스 부분은 전혀 평가되지 않는다.

apt vs aptitude

  • apt

    온라인 repository에서 소프트웨어를 설치하거나 제거하는 패키지 관리 툴
  • aptitude

    주요 패키지 작업 과정을 자동화하여 쉽게 작업할 수 있도록 도와주는 툴로, 사용하지 않는 패키지를 자동으로 제거해주기도 하며 apt보다 유동적이다.

AppArmor란?

취약한 보안을 가진 프로세스가 야기할 수 있는 손상을 막을 수 있도록 작업을 제한하는 보안 모듈

SSH 설정

nano /etc/ssh/sshd_config
ssh 설정 파일 수정

  1. 가상머신 power off
  2. virtual box -> Tools -> network -> Create 클릭하여 vboxnet0 생성


3. born2beroot -> settings -> Network -> Advanced -> Port Fowarding 클릭

4. host IP에 vboxnet ip 입력, guest ip에 가상머신 ip 입력 (hostname -I 명령어로 확인 가능), port 에 4242 입력

5. Attached to: Host-only Adapter로 변경

UFW 방화벽 설치 및 설정

su # root권한으로 접근
apt-get install ufw -y # ufw 설치 -y는 뭐지?
sudo ufw enable # startup 시 방화벽 활성화
# 모든 포트를 차단하고 4242만 허용
sudo ufw default deny
sudo ufw allow 4242
# UFW 상태 확인
sudo ufw status verbose

sudo 설치 및 설정

root 계정으로 전환하여 sudo를 설치해준다

su
apt-get update
apt-get install sudo'

nano /etc/sudoers

# secure_path 끝에 :/snap/bin 추가  

# 다음 설정 추가
Defaults	authfail_message="Authentication faild."
Defaults	badpass_message="The password is incorrect."
Defaults	iolog_dir="/var/log/sudo/"
Defaults	log_input
Defaults	log_output
Defaults	requiretty
Defaults	passwd_tries=3
  
# /var/log/sudo 디렉터리 추가
mkdir /var/log/sudo
  
# sudo 그룹에 유저 추가
usermod -aG sudo hyuncpar
(usermod 명령어 안 될시 export PATH=/usr/sbin:PATH 하여 환경변수에 경로 추가)

Password 정책 설정

nano /etc/login.defs
  
PASS_MAX_DAYS	30 # 패스워드 만기일 설정
PASS_MIN_DAYS	2 # 패스워드 최소 변경일 설정
PASS_WARN_AGE	7 # 패스워드 경고 안내 기한 설정

sudo apt install libpam-pwquality # 패스워드 강도 확인하는 모듈

nano /etc/pam.d/common-password

pam_pwquality.so retry=3 minlen=10 ucredit=-1 dcredit=-1 maxrepeat=3 reject_username enforce_for_root difok=7

monitoring.sh

Memory Usage

free -m | grep Mem | awk '{printf"%d/%dMB (%.2f%%)\n", $3, $2, $3/$2 * 100}'
(free: 사용중인 메모리 정보 출력)
(awk 명령어로 $3 $2 등 해당 인자만 출력)

Disk Usage

(df -a -MB: 모든 파일시스템 디스크 사용량 표시)
(awk '{sum+=$3}END{print sum}' 특정 필드의 합 구하기)

CPU Load

(mpstat: CPU 모든 상태 표시)

Last Boot

(who -b: 시스템 부팅 시간 표시)

LVM use

(lsblk: 파티션 상태 표시)

Connections TCP

(ss: 리눅스 내 네트워크 상태 출력)

User log

cron 설정

crontab -e

profile
기록하는 습관 들이기

0개의 댓글