[42seoul] Born2beroot

ppparkta·2022년 8월 6일
1

42Seoul

목록 보기
2/7

subject pdf

mandatory part

대부분 번역했으나 구체적인 내용은 실제 subject확인

  • 아래의 지시에 따라 버추얼 머신을 사용해서 가상머신을 구축하는 과제

저장소 루트에 있는 signature.txt 파일만 제출함. 컴퓨터에 있는 가상디스크 서명을 붙여넣어야 함.

버추얼머신을 사용함. GUI사용하지 않음. CUI만 사용해서 미니멀한 서버 구축. 데비안 추천(or CentOS)

LVM을 사용해서 암호화된 파티션 2개 이상 생성해야 함

aptitude와 apt의 차이점, SELinux, AppArmor가 무엇인지 설명할 수 있어야 함

SSH사용은 디펜스 중 새로운 계정을 설정하는 것으로 테스트 함.(따라서 SSH의 작동방식을 알아야 함)

  • UFW방화벽으로 os를 구성하고 포트4242만 열어둠

  • 가상머신 호스트 이름은 42로 끝나야 함(ex: wil42) 평가받는 동안 호스트 이름을 수정해야 함

  • 강한 패스워드 정책을 구현해야 함

  • 엄격한 sudo 규칙에 따라 설치하고 구성해야 함

  • 루트사용자 이외의 사용자 이름으로 로그인한 사용자가 있어야 함

  • 이 사용자는 user42, sudo 그룹에 속해야 함

평가하는 동안 새로운 유저를 생성하고 그룹을 할당해야 함

  • 강력한 패스워드 정책 설정방법
    • 패스워드는 30일마다 만료되어야 함
    • 패스워드 수정이 완료되기까지 허용되는 최소 일수는 2일로 설정해야 함
    • 사용자는 패스워드 만료 7일 전에 커스텀한 경고메세지를 받음
    • 패스워드는 10글자를 넘겨야 함(대문자, 숫자를 포함하고 동일한 문자를 3개 이상 포함하지 않음)
    • 패스워드에 사용자 이름을 포함하면 안됨
    • 루트 패스워드를 제외하고 이전 패스워드의 일부가 아닌 최소 7글자
    • 루트 패스워드는 위의 정책을 준수해야 함

구성 파일을 설정한 뒤에 루트 계정을 포함해 가상머신에 있는 모든 계정의 비밀번호를 변경해야 함

  • sudo그룹을 강력한 구성설정
    • sudo를 사용하기 위한 인증에서 패스워드를 3번 틀릴 경우 제한함
    • sudo를 사용할 때 잘못된 패스워드로 접근해서 에러가 나면 커스텀 메세지를 출력함
    • sudo를 사용하는 각 작업은 입/츨력 모두 저장돼야 함. 로그 파일은 /var/log/sudo/에 저장됨
    • 보안상의 이유로 TTY모드를 사용해야 함
    • 보안상의 이유로 sudo가 사용할 수 있는 경로를 제한해야 함
  • 마지막으로 monitoring.sh라는 스크립트 파일을 bash에서 만들어야 함
  • 서버가 시작할 때 스크립트는 10분마다 어떤 정보를 터미널에 출력해야 함
    • 운영체제 및 해당 커널 버전의 아키텍처
    • 물리적 프로세서의 수
    • 가상 프로세서의 수
    • 서버의 현재 사용 가능한 RAM 및 사용률
    • 서버의 현재 사용 가능한 메모리 및 사용률
    • 프로세서의 현재 사용률을 백분율로 표시함
    • 마지막 재부팅 날짜 및 시간
    • LVM이 활성 상태인지 여부
    • 활성 연결 수
    • 서버를 사용하는 사용자 수
    • 서버의 IPv4 주소 및 해당 MAC(Media Access Control)(=물리주소) 주소
    • sudo 프로그램으로 실행된 명령의 수

디펜스 하는 동안 스크립트가 어떻게 작동하는지 설명해야 함. 수정하지 않고 중단해야 함. 크론 살펴보기

bonus

  • 파티션을 올바르게 설정해서 아래와 유사한 구조 나타내기(원문 사진 참조)
  • lighttpd, MariaDB 및 PHP 서비스를 사용하여 기능적인 WordPress 웹사이트를 설정함
  • 유용하다고 생각하는 서비스를 선택해서 설정함(NGINX/Apache2 제외) 방어하는 동안 왜 선택했는지도 디펜스해야 함

보너스 부분을 완료하기 위해 추가 서비스를 설정할 수 있음. 이 경우 필요에 맞게 더 많은 포트를 열 수 있음. (UFW 규칙은 그에 따라 조정돼야 함)


Project overview

1. 버추얼머신은 어떻게 작동하는가?

Hypervisor 아래의 OS를 host라고 하고 위의 VM OS를 guest라고 한다.

  • 버추얼 머신은 물리적으로 존재하는 운영체제가 아닌, 이미 존재하는 물리 서버에서 여러개의 운영체제를 구동할 수 있도록 만든 기술이다.
  • Hypervisor는 VM을 생성하고 그 위에서 각각의 VM을 구동시킨다.
  • 대표적인 Hypervisor에는 virtualbox가 있다.
  • hypervisor 위에 host OS가 올라가는 경우도 있으나 과제에서는 앞서 설명한 host / guest로 나눠진 OS를 사용한다.

2. 무슨 운영체제를 골랐는가?

  • 내가 선택한 운영체제는 데비안이다. subject에서 시스템 관리를 처음 시작하는 사람에게 Debian을 강력 추천한다는 문장을 보고 선택했다.

3. CentOS와 Debian의 차이점은 무엇인가?

  • 참고 자료 CentOS vs Debian
  • 참고자료마다 말이 달라서 위의 링크 기준으로 작성

CentOS

  • RHEL 소스 코드를 그대로 가져와서 상표 등을 제외한 다음 무료 배포함
  • 오픈소스 프로젝트 커뮤니티에 의해 관리됨
  • 다양한 아키텍처를 지원하지 않음
  • 주로 기업용 서버에 사용함
  • 쉬운 gui가 없음
  • .rpm 패키지

Debian

  • 데비안 프로젝트의 자유 운영체제임
  • apt 사용으로 패키지 설치 및 업그레이드가 단순함
  • Ubuntu는 debian 기반 os임
  • 데스크탑 친화적인 gui가 있음
  • .deb 패키지 사용

4. 버추얼머신의 목적은 무엇인가?

비용절감

하나의 인프라에 여러 가상환경을 실행하면 물리적 인프라 공간을 줄일 수 있다. 이렇게 하면 수익이 향상되어 거의 동일한 수의 서버를 유지 관리해야 하는 필요성이 줄어들고 유지 관리 비용이 절감된다.

속도향상

VM을 가동하는 것은 비교적 쉽고 빠르며 완전히 새로운 환경을 세팅하는 것보다 간단하다.

시스템을 이용할 수 없는 시간을 감소함

VM은 이식성이 뛰어나고 다른 시스템의 한 하이퍼바이저에서 다른 하이퍼바이저로 쉽게 이동할 수 있다. 호스트가 예기치 않게 다운되는 경우 백업을 위한 대안이 될 수 있다.

확장성

VM을 사용하면 물리적 또는 가상 서버를 추가하여 여러 VM에 업무를 분산함으로써 앱을 쉽게 확장할 수 있다. 앱의 가용성과 성능을 높일 수 있다.

보안

가상 머신은 여러 운영 체제에서 실행되기 때문에 VM에서 게스트 운영 체제를 사용하면 보안이 의심스러운 앱을 실행하고 호스트 운영 체제를 보호할 수 있다. 호스트 컴퓨터의 위험을 피하기 위해 바이러스를 격리하여 컴퓨터 바이러스를 안전하게 연구하는 데 자주 사용된다고 한다.

5. aptitude와 apt의 차이점, APPArmor는 무엇인가?

aptitude

  • gui와 cli를 모두 제공함
  • 상위 수준의 패키지 관리자
  • 설치나 삭제할 때 충돌이 생기면 마땅한 조치를 추천함
  • 사용하지 않는 패키지는 자동으로 제거함

apt

  • cli만 제공함
  • 상위 수준의 패키지 관리자가 사용할 수 있는 하위 수준 패키지 관리자
  • 설치나 삭제할 때 충돌이 생기면 프로세스가 죽을 수 있음
  • 사용하지 않는 패키지에 대한 추가적인 옵션 필요함

APPArmor

  • 리눅스 커널의 보안 모듈
  • 상태 확인 명령어 sudo aa-status
  • 개별 프로그램을 prifile 파일을 통해서 보호
    • 네트워크 엑세스 권한
    • raw 소켓 엑세스 권한
    • 파일 읽기, 쓰기, 실행 권한

Simple setup

1. 시작 시 cli 환경인가?

2. machine에 접근하기 위해 비밀번호를 물어보는가?

3. 패스워드가 정책에 맞는가?

  • 아래의 내용은 subject의 내용을 번역한 것임
  • 강력한 패스워드 정책 설정방법
    • 패스워드는 30일마다 만료되어야 함
    • 패스워드 수정이 완료되기까지 허용되는 최소 일수는 2일로 설정해야 함
    • 사용자는 패스워드 만료 7일 전에 커스텀한 경고메세지를 받음
    • 패스워드는 10글자를 넘겨야 함(대문자, 숫자를 포함하고 동일한 문자를 3개 이상 포함하지 않음)
    • 패스워드에 사용자 이름을 포함하면 안됨
    • 루트 패스워드를 제외하고 이전 패스워드의 일부가 아닌 최소 7글자
    • 루트 패스워드는 위의 정책을 준수해야 함

4. UFW 서비스가 실행되었는가?

$ sudo ufw status

5. SSH 서비스가 실행되었는가?

$ systemctl status ssh

6. 데비안 운영체제인가?

$ cat /etc/os-release

User

1. 유저가 sudo와 user42에 속해있는지 확인하기

$ getent group sudo user42
// or
$ id <username>

2. 새로운 유저 생성하기

$ sudo useradd -m <username>
$ sudo passwd <username>
//m: 홈 디렉토리 생성

3. 패스워드 정책에 맞는 패스워드를 설정 후, 패스워드 정책의 설정 방법 설명하기

$ sudo vi /etc/login.defs
PASS_MAX_DAYS 30 // 30일 후 만료
PASS_MIN_DAYS 2 // 최소 사용 2일
PASS_WARN_AGE 7 // 7일전에 경고
PASS_MIN_LEN 10 // 최소 10글자
$ sudo apt install libpam-pwquality
$ sudo vi /etc/pam.d/common-password
retry=3 // 재입력 최대 3회
minlen=10 // 최소 길이 10
difok=7 // 기존 패스워드에서 변경된 최소 글자 7
maxrepeat=3 // 연속된 동일 문자 3
ucredit=-1 // 대문자 한개 이상
lcredit=0 // 소문자 없어도 됨
ocredit=0 // 특수문자 없어도 됨
dcredit=-1 // 숫자 한개 이상
reject_username // username이 포함된 패스워드 사용 불가능
enforce_for_root // root 계정도 위의 정책 적용됨

3. evaluating 그룹 만들고 해당 그룹에 새로운 유저 추가하기

$ sudo groupadd evaluating  // 그룹 추가 
$ sudo usermod -aG evaluating <username> // user가 기존 그룹과 명시된 그룹에 속하게 함
$ id username // 유저 정보 확인

4. 패스워드 정책의 장단점 설명하기

패스워드 정책의 장점

  • 보안성 향상

패스워드 정책의 단점

  • 패스워드를 별도로 관리해야 하는 까다로움
  • 복잡한 패스워드 정책으로 인해 패스워드를 잊기 쉬움

Hostname and partitions

1. hostname이 'login42' 형식인가?

$ hostnamectl

2. hostname을 변경한 뒤 restart하기

$ sudo hostnamectl set-hostname <hostname>
$ sudo reboot

3. 원래의 hostname으로 복구하기

$ sudo hostnamectl set-hostname <hostname>

4. partitions 확인하기

$ lsblk

5. partitions와 subject 비교하기

6. LVM가 무엇이고 어떻게 작동하는가?

  • Logical Volume Manger
  • 물리적인 디스크를 논리 디스크로 할당해서 유연하게 관리할 수 있게 함
  • 여러 개의 HDD의 용량을 합쳐서 하나의 파일 시스템으로 구성하는 것
  • partition의 애매한 공간을 활용할 수 있음

SUDO

1. sudo 가 설치되어있는가?

$ dpkg -l sudo

sudo 확인하기

$ sudo visudo
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
// 보안을 위해 secure_path(sudo가 사용할 수 있는 경로)를 제한하라
Defaults        passwd_tries=3
// 일치하지 않는 password인 경우 입력은 3회로 제한하라
Defaults        authfail_message="Authentication faliure."
// Authentication 획득 실패 시 출력되는 error 메시지
Defaults        badpass_message="Password is wrong."
// password가 일치하지 않는 경우 출력되는 error 메시지
Defaults        iolog_dir="/var/log/sudo"
// log(input, output)의 저장을 해당 디렉토리에 하라
Defaults        log_input
// sudo 명령어 실행 시 입력된 명령어를 iolog_dir에 log로 저장하라
Defaults        log_output
// sudo 명령어 실행 시 출력 결과를 iolog_dir에 log로 저장하라
Defaults        requiretty
// sudo 명령어가 tty(콘솔, 터미널) 외부(cron)에서 실행되지 않도록하라

/A:/B A에 없으면 B에서 찾기

2. 새 유저를 sudo 그룹에 할당하기

$ sudo usermod -aG sudo <username> 

3. /var/log/sudo/ 에 파일이 한개 이상 존재하는가?

$ sudo ls /var/log/sudo

4. sudo 실행 후 히스토리가 갱신되었는가?

$ sudo apt update
$ sudo ls /var/log/sudo/00/00

UFW

1. UFW가 실행되고 있는가?

$ sudo ufw --version //설치된 ufw 버전 확인
$ sudo ufw status //ufw 실행여부 확인
//만약 비활성화라면
$ sudo ufw enable

2. UFW를 왜 사용하는가?

UFW(Uncomplicated Firewall, 복잡하지 않은 방화벽)

debian과 linux에서 사용하기 쉬운 방화벽 관리 프로그램이다. 간단한 명령과 명령수가 적은 명령줄 인터페이스를 사용한다. 과제에서 UFW를 사용하라는 이유도 이와 같을 것.

3. 활성화된 UFW rule list에 port4242에 관한 규칙이 존재하는가?

$ sudo cat /etc/ufw/user.rules

4. port8080을 열기위해 새로운 규칙을 추가하고 rule list에 활성화된 규칙이 추가되었는지 확인하기

$ sudo ufw allow 8080

$ sudo cat /etc/ufw/user.rules
// $ sudo ufw status

5. 새로운 룰을 삭제해라

$ sudo ufw status numbered
$ sudo ufw delete 8080

SSH

1. SSH가 실행되고 있는가?

$ sudo ssh -V // SSH 설치 여부 확인
$ systemctl status ssh // SSH 작동 여부 확인

2. SSH를 왜 사용하는가?

3. SSH가 Port4242만 사용하는가?

$ sudo vi /etc/ssh/sshd_config 

4. 새로 만든 유저로 SSH에 접속하기

$ ssh <username>@<mac_ip> -p 4242

5. 루트는 SSH를 사용할 수 없는 것 확인하기

$ cat /etc/ssh/sshd_config | grep "PermitRootLogin"

script monitoring

1. monitoring

printf "#Architecture: "
uname -a

printf "#CPU physical : "
nproc --all

printf "#vCPU : "
cat /proc/cpuinfo | grep processor -c

printf "#Memory Usage: "
free -m | grep Mem | awk '{printf"%d/%dMB (%.2f%%)\n", $3, $2, $3/$2 * 100}'

printf "#Disk Usage: "
df -a -BM | grep /dev/map | awk '{sum+=$3}END{print sum}' | tr -d '\n'
printf "/"
df -a -BM | grep /dev/map | awk '{sum+=$4+$3}END{print sum}' | tr -d '\n'
printf "MB ("
df -a -BM | grep /dev/map | awk '{sum1+=$3 ; sum2+=$4+$3 }END{printf "%d", sum1 / sum2 * 100}' |tr -d '\n'
printf "%%)\n"

printf "#CPU load: "
mpstat | grep all | awk '{printf "%.2f%%\n", 100-$13}'

printf "#Last boot: "
who -b | awk '{printf $3" "$4"\n"}'

printf "#LVM use: "
if [ "$(lsblk | grep lvm -c)" -gt 0 ] ; then printf "yes\n" ; else printf "no\n"; fi

printf "#Connections TCP : "
ss | grep -i tcp -c | tr -d '\n'
printf " ESTABLISHED\n"

printf "#User log: "
who | wc -l

printf "#Network: "
hostname -I | awk '{print $1 " "}' | tr -d '\n'
printf "("
ip link show | awk '$1 == "link/ether" {print $2}' | sed '2, $d' | tr -d '\n'
printf ")\n"

printf "#Sudo : "
bc <<< "ibase=32; $(cat /var/log/sudo/seq)" | tr -d '\n'
printf " cmd\n"

2. cron이 무엇인가?

  • 작업 예약 스케줄러
  • crontab 기반으로 실행됨
  • $ systemctl disable cron
  • $ systemctl stop cron

3. 어떻게 10분마다 실행되게 하는가?

*/10 * * * * bash /root/monitoring.sh | wall
  • 매 10분 / 시 / 일 / 월 / 년 실행
  • wall: ssh 접속 상관 없이 모든 네트워크 사용자에게 출력

bonus

lighttpd

ighttpd("lighty"로 발음)[2]는 표준 준수, 보안 및 유연성을 유지하면서 속도가 중요한 환경에 최적화된 오픈 소스 웹 서버입니다.[인용 필요] 원래 Jan Kneschke가 증거로 작성했습니다. c10k 문제의 개념 - 하나의 서버에서 병렬로 10,000개의 연결을 처리하는 방법[3]이지만 전 세계적으로 인기를 얻었습니다.[4] 그 이름은 "light"와 "httpd"의 합성어입니다.

lighttpd

$ vi /etc/lighttpd/lighttpd.conf

접속 테스트

http://127.0.0.1:8080/index.lighttpd.html 

php-fpm

  • CGI (Common Gateway Interface)

    • 웹 서버에서 정적인 페이지 말고도 동적인 페이지까지 구현하기 위한 프로그램이며 동적 html을 반환함
  • fpm (fastCGI process manager)

vi /etc/lighttpd/conf-available/15-fastcgi-php.conf
systemctl restart php7.4-fpm.service
systemctl restart lighttpd.service

접속 테스트

http://127.0.0.1:8080/info.php

mariaDB

$ mysql_secure_installation
Enter current password for root (enter for none): Enter 누르기
Switch to unix_socket authentication? [Y/n]: N
Chage the root password? [Y/n]: N
Remove anonymous users? [Y/n]: Y
Disallow root login remotely? [Y/n]: Y
Remove test database and access to it? [Y/n]: Y
Reload privilege tables now? [Y/n]: Y

$ systemctl enable mariadb
$ systemctl restart mariadb
$ mariadb -u root -p
CREATE DATABASE wpdb;
GRANT ALL PRIVILEGES ON wpdb.* TO 'wpdbuser'@'localhost' IDENTIFIED BY "password";
FLUSH PRIVILEGES;
EXIT;

접속 테스트

# http://127.0.0.1:8080/wordpress

SMTP

$ telnet localhost 25
$ helo localhost
$ mail from: 
$ rcpt to:
$ data
$ subject:

.
$ quit
profile
겉촉속촉

1개의 댓글

comment-user-thumbnail
2022년 8월 8일

항상 응원해요

답글 달기