Born2beRoot_설정 과정

김지수·2023년 6월 23일
0

42

목록 보기
2/4
https://techdebt.tistory.com/18

를 따라서 vm설치 후 어떻게 설정했는지를 보이는 것이 해당 글의 목적이다.


처음에 실행되고 나서 root계정으로 들어간다.

apt-get update

해당 명령어는 운영체제에서 사용 가능한 패키지들과 그 버전에 대한 정보를 업데이트하라는 명령이다. 설치되어 있는 패키지를 최신으로 업데이트하는 것이 아닌 설치가능한 리스트를 업데이트하라는 의미다.
이와 추가로 알 수 있는 명령어는

apt-get upgrade

로 apt-get install 명령으로 설치한 패키지들을 최신 버전으로 업그레이드 하라는 명령어이다.

apt-get install sudo

sudo를 설치하라는 명령어이다.
여기서 sudo란 root가 아닌 사용자가 root에 준하는 능력으로 sudo 다음에 나오는 명령을 수행하게하는 명령어 이다.

visudo

sudoers에 접근하는 명령어이다.
여기서 sudoers란 sudo 프로그램에서 사용자가 sudo명령을 사용하여 권한 상승을 할때 참조하는 구성 파일이다. sudoers는 시스템의 root계정 또는 sudo 그룹에 속한 사용자만이 수정할 수 있는 권한을 가지고 있다. 해당 파일에서는 사용자, 그룹 및 호스트별로 각각 다른 권한을 할당 할 수 있다. 해당 파일은 /etc/sudoers 경로에 있다. 직접 파일을 수정하는 것 보다는 visudo를 사용하여 수정하는 것이 나은데 이유는 동시에 여러 사용자가 파일 수정하는 것을 방지할 수 있으며, 구문 오류가 있는지 확인해 주기 때문이다.
secure_path 를

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

수정하라 되어있다.
여기서 secure_path란 sudo명령어를 실행할 때 기본적으로 실행 가능한 경로를 제한하는 설정이다. ':'은 구분자로 사용된다.
예를 들어 sudo apt-get install을 하면 :를 구분으로 총 7경로(내가 추가한 곳 까지) 중에서 apt-get 명령어를 검색하고 실행한다.
또한 추가 옵션을 주는데

Defaults	authfail_message="authentication fail"
Defaults	badpass_message="password fail"
Defaults	iolog_dir="/var/log/sudo/"
Defaults	log_input
Defaults	log_output
Defaults	requiretty
Defaults	passwd_tries=3

를 입력해야한다.
여기서 몇가지 살펴보자면
iolog_dir은 sudo 로그를 저장할 디렉토리를 지정하는 옵션이다. 이 옵션을 사용하면 sudo 명령을 실행한 사용자의 로그가 별도의 디렉토리에 저장된다. 만약 따로 설정하지 않는다면 /var/log/auth.log에 저장된다.
log_input은 sudo 명령어가 실행되기 전에 사용자가 입력한 내용을 로그에 기록하도록 하는 옵션이다.
log_output은 sudo가 실행하는 명령의 출력을 로깅할지 여부를 설정하는 옵션이다. 이 옵션을 활성화하면 sudo 명령을 실행할 때 표준 출력과 표준 오류 출력이 로그에 기록된다.
requiretty는 sudo 명령어를 실행할 때 tty를 필요로 하는지 여부를 설정하는 옵션이다. tty란 터미널 디바이스를 의미하며, 로컬에서 명령어를 실행하는 경우에는 tty가 존재하지만 원격에서는 ssh와 같은 프로토콜을 사용하여 접속하는 경우에는 tty가 존재하지 않을 수도 있다. 이 옵션을 활성화하면 원격으로부터 sudo 명령어 실행을 제한 할 수 있다.

mkdir /var/log/sudo

를 입력해야하는데 이유는 방금 설정에서 iolog_dir을 위와 같은 경로로 설정했기 때문이다.

usermod -aG sudo jisukim

이 명령어는 jisukim을 sudo그룹에 추가하는 명령어이다. 이렇게 해야 해당 사용자가 sudo권한을 가지게 된다. 즉 root권한으로 실행할 수 있는 명령어들을 sudo를 사용하여 실행 할 수 있다는 것이다.
여기서 -a는 추가를 의미하고 -G는 그룹을 지정한다. 즉 사용자가 이미 속한 그룹에 추가로 다른 그룹을 지정하여 추가하는 옵션이다.

명령어가 들어갔는지 확인하기 위해 밑의 과정을 거쳐보자.

login: jisukim
password:

입력한 후

apt-get update

를 해보라. 당연히 안되지!! 권한이 없으니까.
그렇다면

sudo apt-get update

를 해보라. 이제 너무 당연히 된다. 권한을 올렸기 때문이다.

이제

su -
cd /var/log/sudo/00/00

으로 들어가보면 내가 입력한 sudo의 명령어 횟수만큼 파일이 늘어남을 확인할 수 있고 각가에 들어가 log를 확인해보면 무슨 명령어를 입력했는지 또한 알 수 있다.

이제 ufw를 설치할 것이다.

su - 
apt-get install ufw -y 
ufw status verbose //status : inactive
ufw enable
ufw default deny 
ufw allow 4242
ufw status verbose

몇가지 의미를 살펴보자.
ufw -y여기서 -y는 물어보는 모든 질문에 yes로 대답한다는 의미이다.
ufw default deny는 기본 정책을 "모든 연결 거부로 설정한다.

이제 ssh를 설치할 것이다.

su -
apt install openssh-server
apt-get install vim
vim /etc/ssh/sshd_config 

ssh 서버를 설치하면 원격으로 서버에 접속하여 파일이나 명령어를 실행할 수 있다.
vim을 설치하고 이후 해당 파일로 이동한다.(vi~/.vimrc를 통해 여러 기능을 더할 수 있음)
여기서 apt와 apt-get의 차이는 거의 없다고 생각하면된다. 다만 apt가 캐시 관리에 대한 개선과 패키지 의존성 문제 해결에 더 나은 기능을 제공하고 있다고만 알고 있으면 된다.
여기서 sshd_config란 OpenSSH 서버의 설정 파일이다. 이 파일은 SSH연결을 처리하는 동안 사용되는 다양한 옵션을 설정할 수 있다.

#Port 22 -> Port 4242
#PermitRootLogin prohibit-password -> PermitRootLogin no

먼저 첫번째줄은 포트 4242만 허용한다는 의미이다.
두번째줄은 root계정으로의 ssh접속을 허용하되 암호 인증 방식으로만 접속을 허용하는 설정에서 root계정으로의 SSH접속을 차단하는 설정으로 변경하라는 것이다.

systemctl restart ssh 
systemctl status ssh

여기서 systemctl은 리눅스 시스템의 서비스, 소켓, 장치, 마우트 포인트 등 시스템의 여러 가지 컴포넌트들을 관리하는 명령어이다.

이제 대망의 네트워크 여기서 삽질 엄청했다.

hostname -I

를 통해 가상머신의 ip를 확인한다.
그 후 가상 머신을 끄고
내 가상 머신의 옵션에서 네트워크에 adapter1에 advanced에 포트 포워딩에 들어가 Port는 모두 4242로 Guset IP는 아까 hostname -I로 그리고 Host IP는 비워둔다. 나는 계속 채웠는데 차리를 바꿀때마다 IP가 바껴서 됐다가 안됐다가했다.
그후 iterm에 들어가서

ssh jisukim@127.0.0.1 -p 4242

로 들어간다.
여기서 127.0.0.1이란 자기 자신 즉 루프백주소임을 알 수 있다.

warning remote host identification has changed

이와 같은 에러가 생성될 수 있다.
이는 /.ssh/known_hosts를 삭제하면 해결된다.


이제 패스워드 정책을 설정하자

su -
vi /etc/login.defs 

해당 파일은 리눅스 시스템에서 로그인 처리와 관련된 설정 파일 중 하나이다. 이 파일은 시스템 전반에 걸쳐 로그인 정책을 설정하고, 새로운 계정 생성 시 기본값을 정의하며, 패스워드 관련 설정도 포함한다.

안에서 다음과 같이 변경한다.

PASS_MAX_DAYS 30
PASS_MIN_DATS 2
PASS_WARN_AGE 7

이거는 직관적으로 무슨 의미인지 알 수 있다.

다음엔

apt-get -y install libpam-pwquality

를 입력한다.
해당 패키지는 사용자 계정의 복잡도를 설장하기 위해 설치하는 패키지이다. 여기서는 비밀번호의 최소길이, 대문자/소문자 사용여부 등을 설정할 수 있다.
그리고

vim /etc/pam.d/common-password 

를 입력한다. 해당 파일은 암호관련 모듈 설정 파일 중 하나이다. common-password 모듈은 사용자가 암호를 변경할 때 사용된다. 이 모듈은 기존 암호를 검증하고 새 암호의 유효성을 확인한다.

retry=3뒤에

minlen=10 ucredit=-1 lcredit=-1 dcredit=-1 maxrepeat=3 reject_username enforce_for_root difok=7

를 연달아 입력한다.
각각의 의미는 다음과 같다.
패스워드의 최소 길이가 10, 대문자, 소문자, 숫자를 최소 1개 포함해야한다는 요구사항, 패스워드에 같은 문자가 연속해서 최대 3번까지 반복, 패스워드에 사용자 이름이 포함되지 않도록 설정, root계정에도 해당 정책 적용, 이전에 사용된 문자와 달라야하는 최소 문자 수를 7로 설정

passwd -e jisukim
passwd -e root

이제 monitoring.sh를 설정해보자.

apt-get -y install sysstat

을 입력한다.
여기서 sysstat이란 시스템 성능 모니터링 도구이다. 해당 패키지는 시스템 리소스 사용률, CPU 사용률, 메모리 사용률 등을 모니터링 할 수 있다.
그 후

vi /root/monitoring.sh

에 들어가서 다음과 같은 명령어를 입력한다.

printf "#Architecture: "
uname -a

현재 시스템의 아키텍처 정보를 출력하는 것이다. username은 현재 시스템의 운영체제, 호스트명, 커널 버전 등의 정보를 출력하지만 -a 옵션을 줌으로써 현재의 아키텍처 정보만 출력한다.

printf "#CPU physical : "
nproc --all

nrpoc은 현재 시스템에서 사용가능한 프로세서의 수를 반환하는 Linux/Unix 명령어이다. '--all' 옵션을 사용하면 시스템의 모든 프로세서 수를 반환한다.

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

proc/cpuinfo에는 시스템에 있는 모든 프로세서(코어)의 정보가 저장되어 있는 파일이다. 여기서 processor를 포함하는 라인을 모두 출력한 후 거기서 라인 줄을 세면, 시스템의 프로세서 수가 된다.

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

free는 시스템의 메모리 정보를 출력한다. 여기서 -m옵션을 사용하면 단위가 MB로 표시된다.
여기서 Mem이라는 문자열을 포함하는 행을 찾는다.
awk에서 $2는 전체 메모리 용량이고, $3은 사용 중인 메모리 용량이다.

printf "#Disk Usage: "
df -BM -a | grep /dev/map | awk '{sum+=$3}END{print sum}' | tr -d '\n'

해당 명령어는 /dev/mapper/로 시작하는 파일시스템의 사용 중인 디스크 용량을 합산하여 출력하는 것이다.
df는 파일 시스템 별로 사용 가능한 디스크 용량, 사용량, 사용하지 않는 용량, 마운트된 디렉터리를 출력한다.
-B는 블록 사이즈를 바이트 대신 다른 단위로 변경하는 것이다.
-M은 MB로 단위를 변경한다는 의미이다.
-a는 모든 파일 시스템을 출력한다.
$3은 파일 시스템의 사용 중인 용량이다. 즉 sum에 누적한다는 의미이다.
END는 awk 명령어의 마지막 줄을 처리하기 전에 실행되는 블록을 지정한다. 즉 전체 파일 시스템 사용량의 총 합이 출력된다.
그 후 출력값에서 개행 문자를 삭제한다.

printf "/"
df -BM -a | grep /dev/map | awk '{sum+=$4}END{print sum}' | tr -d '\n'

해당 명령어는 현재 시스템에서 사용 가능한 디스크 공간의 총합을 출력한다.
$4는 사용 가능한 디스크 공간 값을 의미한다.

printf "MB ("
df -BM -a | grep /dev/map | 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}'

mpstat은 각 CPU 코어의 사용률과 각 코어의 평균 사용률을 보여주는 명령어이다.
$13은 CPU 사용률을 의미한다. 즉 100-$13은 CPU 유휴 시간의 백분율을 표시하는 것이다.

printf "#Last boot: "
who -b | sed 's/^ *system boot  //g'

who는 현재 시스템에 로그인한 사용자를 보여주는 명령어이다. -b옵션은 시스템 부팅 시간을 보여주는 명령어이다. 여기엔 "system boot"라는 문자열이 포함되어 있다.
이를 해결하기 위해 sed명령어를 사용하는 것이며 해당 명령어는 원하는 부분만 출력 및 변호나하는데 사용한다. 여기선 공백으로 치환하는 역할을 한다.

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

lsblk는 lvm을 사용하는 블록 디바이스가 있는지 확인하는 것이다. -gt은 왼쪽에 있는 값이 오른쪽에 있는 값보다 크면 참을 반환하는 비교 연산자이다.

printf "#Connections TCP : "
ss -tunpl | grep tcp | wc -l | tr -d '\n'
printf " ESTABLISHED\n"

여기서 ss는 소켓 정보를 보여주는 명령어이다. -tunpl은 TCP/UDP 소켓 정보를 상세히 보여주는 옵션이다.

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

앞서 말했듯 현재 시스템에 로그인한 사용자를 보여주는 명령어로 해당 라인줄을 세어서 보여주는 명령어이다.

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

현재시스템의 IP 주소를 개행 없이 출력하는 명령어이다.
ip link show는 시스템에 설치된 네트워크 인터페이스의 정보를 출력하는 명령어이다.
그 후는 출력된 결과 중에서, 첫 번째 필드가 "link/ether"인 라인의 두번째 필드를 출력한다. 여기서 "link/ether"는 이더넷 인터페이스의 물리적 주소(MAC 주소)를 나타내는 키워드이다.

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

journalctl은 systemd의 로그 시스템인 journald에서 저장된 로그를 검색하고 출력하는 유틸리티이다. 이는 전통적인 로그 파일 대신 바이너리 파일 형식으로 로그를 저장하고, 이를 검색하기 위해 journalctl을 사용할 수 있다.
_COMM=sudo를 추가함으로써 _COMM필드가 sudo인 로그 메시지를 검색할 수 있도록 한다.

chmod +x monitoring.sh

파일에 실행 권한을 추가하는 명령어이다.

sudo crontab -e

cron은 리눅스에서 백그라운드에서 동작하는 작업 스케줄러이다.
-e옵션은 현재 사용자의 cron 작업을 편집 모드로 열어주는 옵션이다.

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

wall은 시스템에서 메시저를 모든 로그인된 사용자에게 보낼 때 사용하는 명령어이다.
10분마다 해당 스크립트를 실행하고 결과를 모든 사용자에게 알림으로 보낸다.

과제의 요구 조건을 마무리 하기 위해

groupadd user42
usermod -aG sudo,user42 jisukim
usermod -g user42 jisukim

를 입력한다.
여기서 -g 옵션은 사용자의 그룹을 변경하기 위해 사용한다.

이후 터미널에서 goinfree에 있는 .vdi파일을

shasum ~~.vid > signature.txt

에 넣고 push 해주면 된다.

profile
노는게 제일 좋아

0개의 댓글