42 May - 3.Born2beroot (구현)

수현·2023년 4월 26일
0

42Seoul

목록 보기
3/8

📒 Technical consideration

when

  • 23.04.26 수 20:00 ~ 03:30
  • 23.05.01 월 21:30 ~ 23:30
  • 23.05.03 수 20:30 ~ 02:00
  • 23.05.12 금 19:30 ~ 23:00
  • 23.05.19 금 20:00 ~ 01:30
  • 23.05.20 토 14:00 ~ 05:30
  • 23.05.21 일 13:25 ~ 21:30
  • 23.05.22 월 19:10 ~ 21:00 (평가)
내용
제출 파일signature.txt
signature.txt가상 디스크 이미지 파일의 signature 첨부

📌 General guideline

  • VirtualBox를 통해 가상머신 생성하여 운영체제 구현
  • Git repository의 root에 signature.txt 파일만 제출
    • signature.txt : 가상 머신의 디스크 이미지 파일의 signature 붙여 넣기
  • Signature 만들기 (VM이 저장된 기본 설치 폴더 열기)
    • Windows: %HOMEDRIVE%%HOMEPATH%\VirtualBox VMs\
    • Linux: ~/VirtualBox VMs/
    • MacM1: ~/Library/Containers/com.utmapp.UTM/Data/Documents/
    • MacOS: ~/VirtualBox VMs/
  • 가상 머신의 ".vdi" 파일에서 signature를 sha1형식으로 검색
    • Windows: certUtil -hashfile rocky_serv.vdi sha1
    • Linux: sha1sum rocky_serv.vdi
    • Mac M1: shasum rocky.utm/Images/disk-0.qcow2
    • MacOS: shasum rocky_serv.vdi
  • 받을 출력 예시
    • 6e657c4619944be17df3c31faa030c25e43e40af
  • 평가 후 가상 머신의 signaute이 바뀜 (가상 머신을 복제하거나 상태 저장 사용하기)
  • Git repository에 가상 머신 제출하는 것 금지
    • signature.txt파일에 있는 서명과 가상 머신의 서명이 동일해야함

📌 과제 목표

1) 가상 머신 사용법
2) 각 OS 차이점
3) 최소한의 설정 되어있는 리눅스 이용해 자신이 필요한 서비스 설치 후 이용

📒 Mandatory part

📕 1. 서버 구현

⚠️ 주의 사항

  • 서버 구성이 목적이기 때문에, 최소한의 서비스만 설치해야 함
  • 그래픽 인터페이스 사용 불가 (X.org 등)

📕 2. 운영체제 선택

⚠️ 주의 사항

  • 최신 stable 버전인 Debian / Rocky 중 선택 (testing, unstable 제외)
  • AppArmor가 실행 시 작동하고 있어야 함

📕 3. 암호화된 파티션 생성

  • LVM 통해 최소 2개 이상의 암호화된 파티션 생성

📌 apt와 aptitude 차이점

📌 AppArmor 개념

📌 SSH 작동 방식

⚠️ 주의 사항

  • SSH 서비스는 4242포트에서만 작동 (보안상의 이유로 root로는 SSH 연결 불가)
  • SSH 방식은 평가를 진행하면서, 생성된 새 계정을 통해 테스트함

📕 4. UFW 방화벽 구성

  • UFW 방화벽을 운영체제에 구성하고, 4242 포트만 열기
  • 가상 머신을 켰을 때, 방화벽 작동하고 있어야 함

⚠️ 주의 사항

  • 가상 머신의 hostname : soohykim42 (평가 중 hostname 수정)
  • 강력한 패스워드 정책 구현하기
  • 엄격한 규칙에 따라서 sudo 설치 및 구성
  • root 유저와 자신의 아이디 유저도 존재해야 함 (user42와 sudo 그룹에 속해있기)

1) new user 생성 및 그룹 가입

2) password 구성 요구사항

  • password 기간
    • password 30일마다 만료
    • password 변경 후에 수정 가능한 최소 경과일 수는 2일
    • user는 password 만료 7일 전에 경고 메시지 받기
  • password 설정
    • 대문자, 소문자, 숫자를 포함한 최소 10글자 이상
    • 반복되는 글자가 3글자 초과인 경우x
    • 유저의 이름 포함x
    • 현재 password는 최소 7글자 이상이 이전 패스워드와 달라야 함 (root password는 적용x)
  • root password에도 해당 규정 동일하게 적용
  • 패스워드 구성 파일 설정 후에 root 계정 포함한 가상 머신에 있는 모든 비밀번호 바꾸기 !!

3) sudo 설치 및 구성

  • sudo 사용하기 위한 인증
    • 잘못된 비밀번호 입력의 경우 3번의 시도로 제한됨
    • 잘못된 password로 인한 에러 발생 시 설정 메시지 출력
  • sudo를 통한 모든 동작(입출력) 저장
    • log파일들은 /var/log/sudo 폴더에 저장
  • 보안상의 이유로, TTY 모드는 적용되어야 함
    • sudo를 사용할 수 있는 경로는 제한됨
    • 경로 예시 - /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

📕 5. monitoring.sh 스크립트 작성

  • 스크립트는 bash로 작성됨
  • 서버 시작시, 스크립트는 아래 정보를 모든 터미널에 매10분마다 표시 (wall 잘 살펴보기)
  • 배너는 선택사항
  • 에러는 표시되지 않아야 함

1) 스크립트 표시할 정보

  • (1) 운영체제와 커널의 버전에 대한 구조
  • (2) physical 프로세서들의 수
  • (3) virtual 프로세서들의 수
  • (4) 현재 서버에서 사용 가능한 RAM과 사용률 퍼센트
  • (5) 현재 서버에서 사용 가능한 memory와 사용률 퍼센트
  • (6) 프로세서들의 현재 사용률 퍼센트
  • (7) 마지막으로 재시작된 날짜와 시간
  • (8) LVM의 활성화 여부
  • (9) 활성화된 연결들의 개수
  • (10) 서버를 사용하고 있는 유저의 개수
  • (11) 서버의 IPv4 주소와 MAC 주소
  • (12) sudo 프로그램으로 실행된 명령의 수

2) 스크립트 작동 예시

📌 스크립트 동작 방식

  • 스크립트를 동작하지 않고 동작 중지시키기 (cron 잘 살펴보기)

📘 Virtual Box 세팅

1) virtual machine 설치

  • VirtualBox 설치

    • (미설치시) command + space바 ➡ Managed Software Center
    • virtual box 실행
  • new virtual machine 생성

    • Name : deb_ 할 경우 자동 Type과 Version 지정 됨
    • Folder : 클러스터 맥은 용량 제한이 있어서 /goinfre로 설정
    • 메모리 설정 (1024MB)
    • Virtual Hard disk 용량 설정 (8GB)
  • 완성

2) virtual machine에 ISO 마운트

  • debian stable release
    다운로드

    • stable 선택
  • ISO 파일 마운트

    • Setting ➡ Storage ➡ 다운받은 iso 선택
    • debian-(최신버전)-amd64-netinst.iso 다운로드

3) virtual machine 설정

언어, 타임존 설정

  • Install 선택 (CLI 모드)
    • 언어 설정
    • 위치 설정
    • Hostname 설정 (soohykim42)
    • Domainname 설정 (공백)
    • 비밀번호 설정
    • new user 설정

네트워크, 파티션 설정

  • LVM 설정
    • 전체 디스크 사용 및 암호화된 LVM
    • 사용 디스크 선택
    • 홈 디렉토리의 파티션 구분
    • LVM 파티션 여부 선택
    • 파티션 디스크 용량 확인
    • 파티션 되는 디스크 최종 설정
    • 디스크에 해당 내용 적용
    • 미디어 설치x

패키지 매니저, 소프트웨어 패키지, 부트로더 설정

  • 패키지 매니저의 미러링 사이트 장소 선택 (현재 위치)
  • 미러링 사이트 설정
  • 프록시 설정 (공백)
  • 운영체제에 필요한 소프트웨어 패키지 설정
  • 부트로더 설치
  • 부트로더 설치 위치 선택 (/dev/sda)

📘 과제 구현

  • 시작 화면 (disk unlock)
  • 계정 로그인 (soohykim/soohykim)

1) sudo 설치 및 설정

  • sudo 설치를 위한 root 접속

    • su -
  • dpkg 이용 sudo 설치

    • sudo 설치 : apt install sudo
    • sudo 설치 여부 확인 : dpkg -l sudo
  • vim /etc/sudoers 파일 수정

    • visudo : 문법체크 해줘서 실수 발생을 줄여줌, 읽기전용 파일이라 vi로 수정 안될 때 사용
  • sudo 규칙 설정

    • sudo를 사용하기 위한 인증에서, 잘못된 비밀번호 입력의 경우 3번의 시도로 제한
    • sudo 사용 중, 잘못된 패스워드로 인한 에러가 발생했을 때 설정한 메시지 출력
    • sudo를 통한 모든 동작(입출력)은 저장되어야 함 (log파일은 /var/log/sudo 폴더에 저장)
    • 보안적인 이유로 TTY 모드 적용
    • 보안적인 이유로 sudo를 사용할 수 있는 경로 제한됨 (경로 예시)
Defaults	env_reset
Defaults	mail_badpass
Defaults	passwd_tries=3 # sudo실행 횟수를 지정. default가 3
Defaults	authfail_message="원하는 에러메세지" # sudo 인증 실패 시, 사용자 지정 메시지 출력 
Defaults	badpass_message="원하는 에러메세지" # sudo 비번 오류 시, 사용자 지정 메시지 출력
Defaults	log_input # sudo명령어 실행 시 입력된 명령어 log로 저장
Defaults	log_output # sudo명령어 실행 시 출력 결과를 log로 저장
Defaults	iolog_dir="/var/log/sudo/" # sudo log 저장 디렉토리 설정
Defaults	requiretty # sudo명령어 실행 시 tty강제
Defaults 	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

  • 계정명 ALL=(ALL:ALL) ALL 추가

  • 📌 secure_path 설정 이유

    • sudo 명령 실행 시 현재 계정의 쉘이 아닌 새로운 쉘을 생성하여 그 안에서 명령을 실행
    • 명령을 찾을 경로를 나열한 환경변수인 PATH값이 secure_path 트로이목마 해킹 공격에 대한 일차적인 방어 기능 제공함
    • 사용자의 부주의로 인해 현재 계정의 경로에 악의적인 경로가 포함된 경우를 무시함으로써 sudo 통한 전체 시스템 해킹 방지.

2) 그룹 설정

  • 그룹명 추가 : groupadd user42

  • 사용자를 sudo,user42그룹에 추가 : usermod -aG sudo,user42 soohykim

  • 사용자가 user42를 primary그룹으로 지정 : usermod -g user42 soohykim

3) vim 설치 및 Apparmor 설정

  • vim 설치 : sudo apt install vim

  • apparmor 설치 : sudo apt install apparmor

  • apparmor 설치 여부 확인 : sudo dpkg -l apparmor

  • apparmor-utils 설치 : sudo apt install apparmor-utils

  • apparmor 적용여부 확인 : aa-enabled

4) UFW 설정

  • UFW 설치 : sudo apt install ufw

  • UFW 상태 확인 (기본값 inactive) : sudo ufw status verbose

  • UFW가 부팅시 실행 : sudo ufw enable

  • UFW 기본 설정값 deny로 설정 : sudo ufw default deny

  • 4242포트 연결 허용 : sudo ufw allow 4242

  • 설정 후 UFW 상태 확인

5) DHCP 해제 및 SSH 설정

  • ip 주소 확인 : ip addr

  • 게이트웨이 주소 확인 : ip route

  • 네트워크 설정파일 열기 : sudo vim /etc/network/interfaces

    • 수정 전
    • 수정 후 (DHCP의 설정 해제하고, 설정 변경)
  • DHCP 설정 포트 확인 : ss -tunpl

    • 4242 port 확인
  • ssh 상태 확인 : systemctl status ssh

  • server측의 ssh 설정파일 열기 : sudo vim /etc/ssh/sshd_config

    • 수정 전
    • 수정 후 (port 설정, root로그인 차단 설정)
  • ssh 재시작 : sudo systemctl restart ssh

  • 로컬 IP 주소 (가상 머신의 IP) 확인

    • 게스트(Virtualbox의 가상머신) ip의 기본값 : 10.0.2.15
    • ifconfig 대신 ip로 명령어 통합 : ip address
    • ifconfig 사용하려면 net-tools 설치 : sudo apt-get install net-tools
    • ifconfig
    • hostname -I :
  • 호스트(iMac) ip 확인 : ifconfig or ipconfig getifaddr en0

  • Port Forwarding (설정 -> 네트워크)

    • 추가
      (호스트 IP로 4242포트로 접속해서 Guest IP + 4242 포트로 연결)
  • 접속 확인 : ssh soohykim@10.31.5.1 -p 4242

6) 비밀번호 정책 설정

  • 특정 계정 설정 : sudo chage -M 30 -m 2 -W 7 soohykim

  • root 계정 설정 : sudo chage -M 30 -m 2 -W 7 root

  • 전체 계정 설정 : sudo vi /etc/login.defs

    • 수정 전
    • 수정 후 (MAX_DAYS, MIN_DAYS, WARN_AGE 변경)
  • 접속 계정에 대한 패스워드 정책 정보 확인 : chage -l soohykim

  • 📌 chage

    • 계정의 암호와 사용기간을 관리
    • 암호만료일을 통해 암호를 무한정 쓸지, 일정기간 계속 바꾸게 할 지 정할 수 있음
    • 계정만료일이 지나면 그 이후 로그인을 할 수 없음
    • 암호만료일 n일 전부터 암호변경을 요구하는 메시지를 알리고, 암호만료 후 유예기간을 둘 수 있음
  • 비밀번호 정책 설정을 위한 libpam-pwquality 설치 : apt install libpam-pwquality

  • 전체 유저에 대한 정책 설정 :sudo vim /etc/pam.d/common-password

    • 수정 전
    • 수정 후 (설정 변경)
    • retry=N : 암호입력을 N회로 설정
    • minlen=N : 암호의 최소 길이는 N
    • difok=N : 기존 패스워드와 달라야하는 문자 수 N (root 제외)
    • uncredit=-N : 대문자 N개 이상 (N양수 - 대문자로 얻을 수 있는 최대 개수, N음수 - 대문자 최소 개수)
    • lcredit=-N : 소문자 N개 이상
    • decredit=-N : 숫자 N개 이상
    • reject_username : 사용자 이름이 그대로 혹은 뒤집혀 패스워드에 있는지 검사
    • enforce_for_root : root 사용자가 패스워드를 바꾸려 할 때에도 위 조건 적용 (root에게 이전 패스워드를 묻지 않으므로 이전 패스워드와 새 패스워드 비교 검사 안함)
    • maxrepeat=N : 같은 문자가 N번 이상 연속해서 나오는지 검사
  • 📌 passwd

    • passwd : 현재 사용자의 비밀번호 변경
    • sudo passwd : 일시적으로 관리자로 동작하는 상태에서 사용자 비밀번호 변경 (관리자 비밀번호 변경)
    • passwd -e : (관리자로 로그인한 경우에만 실행가능) 현재 상용자의 비밀번호를 만료시키고, 다음 로그인시 신규 비밀번호 설정

7) hostname 및 partitioning 설정

  • 호스트의 전체 정보 확인 : hostnamectl

  • 호스트네임 변경 : sudo hostnamectl set-hostname changehostname

  • 파티셔닝 상태 확인 : lsblk

8) Monitoring.sh

  • cron 설치 여부 확인 : `ps -ef | grep cron'

  • cron 시작 : sudo systemctl start cron

  • sysstat 설치 : sudo apt-get install sysstat

  • monitoring.sh를 cron으로 일정 시간마다 실행 : usermod -aG systemd-journal soohykim

  • monitoring.sh 파일 생성

    • #Architecture (운영체제와 커널의 버전에 대한 구조) uname -a (-a : 모든 정보)
    • #CPU physical (물리 프로세서들의 수) : cat /proc/cpuinfo | grep 'cpu cores' | awk '{print $4}
      • nproc : 현재 사용가능한 프로세스 unit의 개수
    • #vCPU (가상 프로세서들의 수) : lscpu | grep '^CPU(s)' | awk '{print $2}'
      • lscpu : 현재 시스템의 CPU 정보를 보여주는 명령어
    • #Memory Usage (현재 서버에서 사용 가능한 RAM과 백분율로 표현된 사용률) : free --mega | grep Mem | awk '{printf "%d/%dMB (%.2f%%)\n", $3, $2, $3/$2 * 100}'
      • $2 : memory total
      • $3 : memory used
    • #Disk Usage (현재 서버에서 사용 가능한 memory와 백분율로 표현된 사용률)
      • df -a -BM | grep /dev/mapper | awk '{sum+=$3}END{printf sum}
      • printf "/"
      • df -a -BM | grep /dev/mapper | awk '{sum+=$2}END{printf sum}
      • printf "MB ("
      • `df -a -BM | grep /dev/mapper | awk '{sum1+=$3 ; sum2+=$2}END{printf "%d%%)\n", sum1 / sum2 * 100}'
    • #CPU load (백분율로 표현된 프로세서들의 현재 사용률) : mpstat | grep all | awk '{printf "%.2f%%\n", 100-$13}
    • #Last boot (마지막으로 재시작된 날짜와 시간) : who -b | awk '{print $3, $4}
    • #LVM use (LVM 활성화 여부) : if [ "$(lsblk | grep lvm | wc -l) " -eq 0 ] ; then printf "no\n" ; else printf "yes\n" ; fi
    • #Connectios TCP (활성화된 연결들의 개수)
      • ss -tunpl | grep tcp | wc -l | tr -d '\n'
      • `printf "ESTABLISHED\n"
    • #User log (서버를 사용하고 있는 유저의 수) : who | wc -l
    • #Network (서버의 IPv4 주소와 MAC 주소) IP
      • hostname -I | tr -d '\n'
      • `printf "("
      • `ip address | grep ether | awk '{printf $2}'
      • printf ")\n"
    • #Sudo (sudo 프로그램으로 실행된 명령의 수)
      - journalctl _COMM=sudo | grep COMMAND | wc -l | tr -d '\n'
      - `printf "cmd\n"

📒 CPU physical

  • = CPU의 코어 개수
  • 코어 : 물리적인 CPU 프로세서 (프로그램 실행시 실제로 일하는 역할)
  • nproc --all 또는cat /proc/cpuinfo | grep 'cpu cores' | awk 'printf $4}' 확인 가능 (Number of installed Processors on your system)

📒 vCPU

  • = CPU의 쓰레드 개수
  • 가상CPU : 가상 머신에 할당되는 CPU (기본적으로 1개 할당)
  • (thread X core) X physical CPU = vCPU 개수
    • 코어당 제공하는 처리 스레드 수에 점유된 소켓 수 곱함
  • lscpu | grep '^CPU(s)' | awk '{print $2}'

📒 free

  • /proc/meminfo 에서 시스템 메모리 사용량 확인
  • 정보
    • total : 설치된 총 메모리 크기, 설정된 스왑 총 크기
    • used : total에서 free, buff/cache를 뺀 사용중인 메모리
    • free : total에서 used, buff/chace를 뺀 실제 사용 가능한 메모리 용량
    • shared : tmpfs(메모리 파일 시스템), ramfs 등 사용되는 공유 메모리
    • buffer/cache : 커널 버퍼로 사용중인 메모리 + 페이지 캐시와 slab으로 사용중인 메모리
    • available : swapping 없이 새로운 프로세스 할당 가능한 메모리 예상 크기
  • 옵션
    • h : 사람이 읽기 쉬운 단위로 출력
    • b, k, m, g : 바이트, 키비바이트, 메비바이트, 기비바이트
    • kilo, mega, giga, tera, peta : 킬로바이트, 메가바이트, 기가바이트, 테라바이트, 페타바이트

📒 Disk Usage

  • df : 남은 용량 확인
    • a : 모든 파일 시스템 출력
    • k : 킬로 바이트 단위로 남은 용량 확인
    • m : 메가 바이트 단위로 남은 용량 확인
  • du : 현재 directory의 사용량 확인 (서브 디렉토리 포함)
    • a : 현재 디렉토리의 사용량 파일 단위로 출력
    • s : 총 사용량
    • h : 읽기 쉽게 출력
    • sh* : 한단계 서브 디렉토리 기준으로 보여줌

📒 akw END 문법

  • 텍스트 파일을 조회/필터링/가공 출력하는 프로그램
    • 필드 추출 : $1
    • BEGIN, END 명령어

📒 mpstat

  • CPU와 core별로 사용율을 모니터링할 때 사용되는 명령어
  • 정보
    • 04:43:36 PM : mpstat이 수행된 시간
      -CPU : all (모든 cpu)
    • %usr : 사용자 레벨(애플리케이션)이 사용한 CPU 사용율
    • %nice : nice 우선순위와 함께 사용자 레벨에서 수행된 CPU 사용율
    • %sys : 시스템 레벨(커널)에서 사용한 CPU 사용율
    • %iowait : I/O 처리 때문에 기다리는 CPU 시간 백분율
    • %irq : H/W 인터럽트를 서비스하기 위해 사용되는 CPU 사용율
    • %soft : S/W 인터럽트를 서비스하기 위해 사용되는 CPU 사용율
    • %steal : 하이퍼바이저가 다른 가상프로세서에 의해 서비스될 때 기다리는 CPU 시간 백분율
    • %guest : 가상 프로세서가 실행하기 위해 사용되는 CPU 사용율
    • %idle : 유휴시간의 CPU 사용률 (CPU가 미사용 상태였던 시간 비율)

📒 Last Reboot

  • 리눅스 서버가 재부팅되거나 shutdown된 시간 조회
  • last reboot : 마지막으로 시스템을 재부팅한 시간이 언제인지 최신순으로 정렬해서 출력
  • who -b : 마지막 시스템 부팅 시간 표시

📒 journalctl

  • 리눅스 로그 확인
  • 옵션
    • _COMM="로그" : 특정 로그 보기

📒 cron

  • 반복적으로 어떤 작업을 자동 수행해주는 명령어
  • 시간 기반 job scheduler형 daemon 프로세스 (시스템 크론/사용자 크론)
    • crontab : cron 작업 설정 파일 (/etc/crontab 파일 정보)
    • daemon : 사용자가 직접 제어하지 않아도 백그라운드에서 여러 작업 해주는 프로그램
  • mhdommondow요일 user 사용자 command 실행명령

📒 wall

  • 시스템에 로그인한 모든 사용자에게 메시지를 broadcast 역할 (관리자 권한 필요)
  • 컴퓨터 파일과 표준입력을 로그인 된 모든 사용자에게 보여줌

📕 cron

  • crontab 열기 : sudo crontab -e

  • 해당 정보 입력 후 저장 : */10 * * * * ~/monitoring.sh | wall

  • 작동 확인 : sh monitoring.sh or ./monitoring.sh

  • 자동 작동 확인

    • 오류 (crontab -e 에서 monitoring 경로 설정 다시하기, chmod 권한 설정)
    • 성공

9) 과제 제출

  • 제출할 git 폴더에 signaute.txt 파일 생성
  • shasum deb_b2b.vdi | awk '{print $1}' 이용하여 해시값 저장
  • 제출한 signature 파일과 vdi 해시값을 diff 를 이용하여 비교

📒 Bonus part

📕 내용

  • 아래 구조처럼 파티션 구성

  • lighttpd, MariaDB, PHP를 이용해서 WordPress로 기능을 갖춘 웹사이트 구성

  • NGINX, Apache2를 제외하고 유용한 서비스를 구성
    (UFW/Firewalld 규칙에 맞춰 필요한 포트 더 열기 가능)

profile
Notion으로 이동

0개의 댓글