대부분 번역했으나 구체적인 내용은 실제 subject확인
저장소 루트에 있는 signature.txt 파일만 제출함. 컴퓨터에 있는 가상디스크 서명을 붙여넣어야 함.
버추얼머신을 사용함. GUI사용하지 않음. CUI만 사용해서 미니멀한 서버 구축. 데비안 추천(or CentOS)
LVM을 사용해서 암호화된 파티션 2개 이상 생성해야 함
aptitude와 apt의 차이점, SELinux, AppArmor가 무엇인지 설명할 수 있어야 함
SSH사용은 디펜스 중 새로운 계정을 설정하는 것으로 테스트 함.(따라서 SSH의 작동방식을 알아야 함)
UFW방화벽으로 os를 구성하고 포트4242만 열어둠
가상머신 호스트 이름은 42로 끝나야 함(ex: wil42) 평가받는 동안 호스트 이름을 수정해야 함
강한 패스워드 정책을 구현해야 함
엄격한 sudo 규칙에 따라 설치하고 구성해야 함
루트사용자 이외의 사용자 이름으로 로그인한 사용자가 있어야 함
이 사용자는 user42, sudo 그룹에 속해야 함
평가하는 동안 새로운 유저를 생성하고 그룹을 할당해야 함
구성 파일을 설정한 뒤에 루트 계정을 포함해 가상머신에 있는 모든 계정의 비밀번호를 변경해야 함
디펜스 하는 동안 스크립트가 어떻게 작동하는지 설명해야 함. 수정하지 않고 중단해야 함. 크론 살펴보기
보너스 부분을 완료하기 위해 추가 서비스를 설정할 수 있음. 이 경우 필요에 맞게 더 많은 포트를 열 수 있음. (UFW 규칙은 그에 따라 조정돼야 함)
Hypervisor 아래의 OS를 host라고 하고 위의 VM OS를 guest라고 한다.
하나의 인프라에 여러 가상환경을 실행하면 물리적 인프라 공간을 줄일 수 있다. 이렇게 하면 수익이 향상되어 거의 동일한 수의 서버를 유지 관리해야 하는 필요성이 줄어들고 유지 관리 비용이 절감된다.
VM을 가동하는 것은 비교적 쉽고 빠르며 완전히 새로운 환경을 세팅하는 것보다 간단하다.
VM은 이식성이 뛰어나고 다른 시스템의 한 하이퍼바이저에서 다른 하이퍼바이저로 쉽게 이동할 수 있다. 호스트가 예기치 않게 다운되는 경우 백업을 위한 대안이 될 수 있다.
VM을 사용하면 물리적 또는 가상 서버를 추가하여 여러 VM에 업무를 분산함으로써 앱을 쉽게 확장할 수 있다. 앱의 가용성과 성능을 높일 수 있다.
가상 머신은 여러 운영 체제에서 실행되기 때문에 VM에서 게스트 운영 체제를 사용하면 보안이 의심스러운 앱을 실행하고 호스트 운영 체제를 보호할 수 있다. 호스트 컴퓨터의 위험을 피하기 위해 바이러스를 격리하여 컴퓨터 바이러스를 안전하게 연구하는 데 자주 사용된다고 한다.
sudo aa-status
prifile
파일을 통해서 보호$ sudo ufw status
$ systemctl status ssh
$ cat /etc/os-release
$ getent group sudo user42
// or
$ id <username>
$ sudo useradd -m <username>
$ sudo passwd <username>
//m: 홈 디렉토리 생성
$ 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 계정도 위의 정책 적용됨
$ sudo groupadd evaluating // 그룹 추가
$ sudo usermod -aG evaluating <username> // user가 기존 그룹과 명시된 그룹에 속하게 함
$ id username // 유저 정보 확인
$ hostnamectl
$ sudo hostnamectl set-hostname <hostname>
$ sudo reboot
$ sudo hostnamectl set-hostname <hostname>
$ lsblk
$ dpkg -l 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에서 찾기
$ sudo usermod -aG sudo <username>
$ sudo ls /var/log/sudo
$ sudo apt update
$ sudo ls /var/log/sudo/00/00
$ sudo ufw --version //설치된 ufw 버전 확인
$ sudo ufw status //ufw 실행여부 확인
//만약 비활성화라면
$ sudo ufw enable
UFW(Uncomplicated Firewall, 복잡하지 않은 방화벽)
debian과 linux에서 사용하기 쉬운 방화벽 관리 프로그램이다. 간단한 명령과 명령수가 적은 명령줄 인터페이스를 사용한다. 과제에서 UFW를 사용하라는 이유도 이와 같을 것.
$ sudo cat /etc/ufw/user.rules
$ sudo ufw allow 8080
$ sudo cat /etc/ufw/user.rules
// $ sudo ufw status
$ sudo ufw status numbered
$ sudo ufw delete 8080
$ sudo ssh -V // SSH 설치 여부 확인
$ systemctl status ssh // SSH 작동 여부 확인
$ sudo vi /etc/ssh/sshd_config
$ ssh <username>@<mac_ip> -p 4242
$ cat /etc/ssh/sshd_config | grep "PermitRootLogin"
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"
*/10 * * * * bash /root/monitoring.sh | wall
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
CGI (Common Gateway Interface)
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
$ 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
$ telnet localhost 25
$ helo localhost
$ mail from:
$ rcpt to:
$ data
$ subject:
.
$ quit
항상 응원해요