📒 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개 이상의 암호화된 파티션 생성
⚠️ 주의 사항
- SSH 서비스는 4242포트에서만 작동 (보안상의 이유로 root로는 SSH 연결 불가)
- SSH 방식은 평가를 진행하면서, 생성된 새 계정을 통해 테스트함
- 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 설치
2) virtual machine에 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 설정
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의 코어 개수
- 코어 : 물리적인 CPU 프로세서 (프로그램 실행시 실제로 일하는 역할)
nproc --all
또는cat /proc/cpuinfo | grep 'cpu cores' | awk 'printf $4}'
확인 가능 (Number of installed Processors on your system)
- = CPU의 쓰레드 개수
- 가상CPU : 가상 머신에 할당되는 CPU (기본적으로 1개 할당)
- (thread X core) X physical CPU = vCPU 개수
- 코어당 제공하는 처리 스레드 수에 점유된 소켓 수 곱함
lscpu | grep '^CPU(s)' | awk '{print $2}'
- /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* : 한단계 서브 디렉토리 기준으로 보여줌
- 텍스트 파일을 조회/필터링/가공 출력하는 프로그램
- 필드 추출 : $1
- BEGIN, END 명령어
- 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가 미사용 상태였던 시간 비율)
- 리눅스 서버가 재부팅되거나 shutdown된 시간 조회
last reboot
: 마지막으로 시스템을 재부팅한 시간이 언제인지 최신순으로 정렬해서 출력
who -b
: 마지막 시스템 부팅 시간 표시
📒 journalctl
📒 cron
- 반복적으로 어떤 작업을 자동 수행해주는 명령어
- 시간 기반 job scheduler형 daemon 프로세스 (시스템 크론/사용자 크론)
- crontab : cron 작업 설정 파일 (/etc/crontab 파일 정보)
- daemon : 사용자가 직접 제어하지 않아도 백그라운드에서 여러 작업 해주는 프로그램
m
분 h
시 dom
일 mon
월 dow
요일 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 규칙에 맞춰 필요한 포트 더 열기 가능)