100%를 한번에 바꾸는건 어려워도 1%를 100번 바꾸는건 쉽다.

생각정리 자세히보기

42 Seoul

[42 Seoul] Born2BeRoot 설정가이드(Debian)

dc-choi 2022. 5. 13. 16:16
반응형

사진만 따라하면 누구나 설치가 가능하도록 작성하였습니다.

본 게시글은 Born2BeRoot의 Mandatory part만 구현을 했습니다.

Bonus part까지의 구현을 원하신다면 다른 블로그의 게시글을 확인해주시기 바랍니다.

 

설치환경: 클러스터 iMac

 

크게 9가지 구성으로 나뉩니다.

1. sudo 설치 및 설정

2. 그룹 설정

3. vim 설치 및 Apparmor 설정

4. UFW 설정

5. DHCP 해제 및 SSH 설정

6. 비밀번호 정책 설정

7. 호스트네임 및 파티셔닝 설정

8. Monitoring.sh

9. 과제 제출시

 

sudo 설치 및 설정

su -

sudo를 설치하기 위해서는 루트로 접속을 해야한다. 루트로 접속한다.

 

dkpg -l sudo

sudo의 설치여부를 확인한다.

 

apt install sudo

만약 sudo가 설치되어있지 않다면, apt를 사용해서 sudo를 설치한다.

 

visudo

visudo를 이용해서 /etc/sudoers 파일을 수정한다.

 

visudo란?

직접 /etc/sudoers 파일을 편집하다가 실수가 발생하면, sudo를 사용할 수 없게 된다. visudo를 사용하면 문법체크를 해줘서 실수가 발생해도 고치는게 가능함.

 

Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

Defaults	authfail_message="원하는 에러메세지" #권한 획득 실패 시 출력 (sudo 인증 실패 시)
Defaults	badpass_message="원하는 에러메세지" #sudo인증에서 비밀번호 틀리면 출력
Defaults	log_input #sudo명령어 실행 시 입력된 명령어 log로 저장
Defaults	log_output #sudo명령어 실행 시 출력 결과를 log로 저장
Defaults	requiretty #sudo명령어 실행 시 tty강제
Defaults	iolog_dir="/var/log/sudo/" #sudo log 저장 디렉토리 설정
Defaults	passwd_tries=3 #sudo실행 횟수를 지정. default가 3

visudo로 열었으면, 프로젝트의 요구사항대로 메시지들을 추가한다.

 

secure_path를 설정하는 이유

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

 

그룹 설정

groupadd user42 #user42라는 그룹명을 추가한다.
usermod -aG sudo,user42 <username> #<username>이 sudo,user42라는 그룹에 속하도록 하는데 기존 그룹에는 영향이 없게 변경
usermod -g user42 <username> #<username>이 user42를 primary그룹으로 가지도록 설정

user42 그룹을 만들고, 사용자 그룹에 sudo, user42 그룹을 추가한다.

 

Vim 설치 및 Apparmor 설정

sudo apt install vim

vim을 설치힌다.

 

sudo dpkg -l apparmor

apparmor의 설치여부를 확인한다.

 

sudo apt install apparmor

만약 apparmor가 설치되어있지 않다면, apt를 사용해서 apparmor를 설치한다.

 

sudo apt install apparmor-utils

apparmor-utils도 설치한다.

 

aa-enabled

aa-enabled 명령어를 사용해서 apparmor의 적용여부를 확인한다.

 

UFW 설정

sudo apt install ufw

ufw를 설치한다.

 

sudo ufw status verbose

ufw의 상태를 확인한다. (기본값 inactive)

 

sudo ufw enable

ufw가 부팅될 때 실행되도록 한다.

 

sudo ufw default deny

ufw의 기본 설정값을 deny로 설정한다.

 

sudo ufw allow 4242

프로젝트의 요구사항대로 4242포트의 연결을 허용한다.

 

DHCP 해제 및 SSH 설정

ip addr
ip route

다음 명령어를 통해 ip주소, 게이트웨이의 주소를 알아낸다.

 

sudo vim /etc/network/interfaces

네트워크에 대한 설정파일을 연다.

 

iface enp0s3 inet static
address 10.0.2.15
netmask 255.255.255.0
gateway 10.0.2.2

DHCP의 설정을 해제하고 다음 사진처럼 설정을 변경한다. (리부트한다.)

 

ss -tunpl

DHCP의 설정 포트가 닫힌것을 확인할 수 있다.

 

systemctl status ssh

ssh 상태를 확인한다.

 

sudo vim /etc/ssh/sshd_config

server측의 ssh 설정파일을 연다.

 

Port 4242
PermitRootLogin no

포트 설정과 루트로그인차단을 설정하고 주석을 제거해준다.

 

sudo systemctl restart ssh

ssh를 재시작한다.

 

ifconfig

ifconfig 명령어를 통해 자신의 로컬 IP주소를 확인한다.

 

설정에 네트워크 탭에 들어가서 포트포워딩 버튼을 클릭힌다.

 

호스트의 IP를 입력하고, 게스트 ip를 입력하고 ok를 누른다.

 

ssh <username>@<hostIP> -p 4242

ssh 접속을 시도한다.

 

접속이 되는것을 확인한다.

 

포트포워딩 원리

https://lamanus.kr/59

 

비밀번호 정책 설정

sudo chage -M 30 -m 2 -W 7 <username>

위의 명령어로는 전체 계정에 적용할 수 없다. (이거땜에 리트함) 다음처럼 해야한다.

sudo vi /etc/login.defs

프로젝트의 요구사항에 따라 접속계정에 대한 패스워드 정책을 설정한다.

참고:

https://ostechnix.com/how-to-set-password-policies-in-linux/

 

PASS_MAX_DAYS	30
PASS_MIN_DAYS	2
PASS_WARN_AGE	7

다음 사진처럼 설정한다.

 

chage -l <username>

접속계정에 대한 패스워드 정책 정보를 확인한다.

 

chage란?

계정의 암호와 사용기간을 관리하는 것이라 생각하면 편하다. 암호만료일을 통해 암호를 무한정 쓸지, 일정기간 계속 바꾸게 할지 정할 수 있다. 계정만료일이 지나면 그 이후 로그인을 할 수 없고, 관리자에게 연락해야 한다. 암호만료일 n일 전부터 암호변경을 요구하는 메세지를 알릴 수 있고, 암호만료 후 유예기간을 둘 수 있다.

 

sudo apt install libpam-cracklib

전체 유저에 대한 정책을 설정한다. 프로젝트의 비밀번호 정책 설정을 위해서 libpam-cracklib를 설치한다.

 

sudo vim /etc/pam.d/common-password

패스워드 정책 설정 파일을 들어간다.

 

retry=3 minlen=10 difok=7 ucredit=-1 decredit=-1 reject_username enforce_for_root maxrepeat=3

pam_cracklib.so부분에 다음처럼 설정한다.

 

  • retry=N : 암호입력을 N회로 설정
  • minlen=N : 암호의 최소 길이는 N
  • difok=N : 기존 패스워드와 달라야하는 문자 수 N
  • ucredit=-N : 대문자 N개 이상 (N이 양수/음수인지 따라 뜻이 다름, 서브젝트 기준에 맞추어 음수로)
  • lcredit=-N : 소문자 N개 이상 (위와 동일)
  • decredit=-N : 숫자 N개 이상 (위와 동일)
  • reject_username : 사용자의 이름이 그대로 혹은 뒤집혀 패스워드에 있는지 검사
  • enforce_for_root : root사용자가 패스워드를 바꾸려 할 때에도 위 조건 적용
  • maxrepeat=N : 같은 문자가 N번 이상 연속해서 나오는지 검사

 

credit 명령어에서 N의 양수 음수 차이

(N >= 0) 새 패스워드에서 대문자로 얻을 수 있는 최대 점수. 대문자가 N 개 이하로 있으면 각 글자를 현재 minlen 값 검사에 +1씩 계산한다. ucredit 기본값은 1인데, 10보다 작은 minlen에 적당한 값이다.

(N < 0) 새 패스워드에 있어야 하는 대문자 최소 개수.

 

enforce_for_root

root에게는 이전 패스워드를 묻지 않으므로 이전 패스워드와 새 패스워드를 비교하는 검사를 수행하지 않는다. 따라서 별다른 작성 없이 서브젝트에서 요구하는 정책을 수행할 수 있다.

 

passwd 현재 사용자의 비밀번호 변경

sudo passwd  일시적으로 관리자로 동작하는 상태에서 사용자 비밀번호 변경 > 즉 관리자 비밀번호 변경

passwd -e  (관리자로 로그인한 경우에만 실행가능) 현재 사용자의 비밀번호를 만료 시키고 이다음 번 로그인 시 신규 비밀번호 설정

 

호스트네임 및 파티셔닝 설정

hostnamectl

호스트에 대한 전체 정보를 확인할 수 있다.

 

sudo hostnamectl set-hostname <변경할 hostname>

호스트네임을 변경할 수 있다.

 

lsblk

파티셔닝의 상태를 확인할 수 있다. (설치를 정상적으로 진행했다면 위 사진처럼 나옴.)

 

Monitoring.sh

ps -ef | grep cron

cron의 설치여부를 확인한다.

 

sudo systemctl start cron

cron을 시작한다.

 

sudo apt-get install sysstat
usermod -aG systemd-journal <username>

monitoring.sh를 cron으로 일정 시간마다 돌리기 위해서는 다음 명령어를 입력해야 함.

 

#!/bin/bash

printf "#Architecture: "
uname -a

printf "#CPU physical : "
nproc --all

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

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

printf "#Disk Usage: "
df -BM -a | grep /dev/mapper/ | awk '{sum+=$3}END{print sum}' | tr -d '\n'
printf "/"
df -BM -a | grep /dev/mapper/ | awk '{sum+=$4}END{print sum}' | tr -d '\n'
printf "MB ("
df -BM -a | grep /dev/mapper/ | awk '{sum1+=$3 ; sum2+=$4 }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 | sed 's/^ *system boot  //g'

printf "#LVM use: "
if [ "$(lsblk | grep lvm | wc -l)" -gt 0 ] ; then printf "yes\n" ; else printf "no\n" ; fi
printf "#Connections TCP : "
ss -tunpl | grep tcp | wc -l | tr -d '\n'
printf " ESTABLISHED\n"

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

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

printf "#Sudo : "
journalctl _COMM=sudo | grep COMMAND | wc -l | tr -d '\n'
printf " cmd\n"

monitoring.sh 파일을 생성한다.

 

sudo crontab -e

루트의 crontab을 연다.

 

*/10 * * * * /monitoring.sh | wall

해당 내용을 입력하고 저장한다.

 

정상작동 확인.

 

과제 제출시

평가를 받아야하기 때문에 shasum 명령어를 이용해서 문자열을 생성한 후, 제출해야한다.

이때, 과제를 제출할 때의 문자열을 유지해야하기 때문에 스냅샷을 사용해야하는데, 스냅샷을 딴 vdi의 문자열을 따야한다.

반응형

'42 Seoul' 카테고리의 다른 글

[42 Seoul] minitalk  (0) 2022.06.03
[42 Seoul] Born2BeRoot 설치가이드(Debian)  (0) 2022.05.12
[42 Seoul] Born2beRoot  (0) 2022.05.09
[42 Seoul] Printf  (0) 2022.04.22
[42 Seoul] Get Next Line  (0) 2022.03.07