Born2beroot 정리

nhwang·2022년 4월 18일
0

[요구사항 및 평가 사항]
1. Debian OS 설명
2. LVM partition한 부분 보여주고 LVM에 대한 설명 필요
3. 머신 실행과 동시에 Apparmor 실행. (설명할 것)
4. apt와 aptitude차이 설명할 것.
5. Port는 4242만 열어둘 것 / 방화벽에 대한 설명
6. SSH 또한 4242를 통해 접속하도록 하고 평가자에게 보여 줄 것.(이때 보안을 위해 root로는 접속할 수 없어야 한다.) SSH에 대해 설명할 것.
7. 존재하는 모든 유저는 user42와 sudo에 속해있을 것.
8. sudo 명령을 통한 행위는 로그를 모두 남길 것.
9. Host명은 42로 끝나도록 할 것.
10. 포트포워딩 설명할 것
11. 아주 강력한 비밀번호 정책을 가질 것.
12. 매 10분 마다 과제에서 요구하는 모니터링 스크립트를 실행하도록 할 것. (평가 중간에 중단시킬 것)

aptitude vs apt >>> aptitude는 기본적으로 apt를 내장하고있고 함수(기능)적으로 필요할때 내장apt를 씀
ㄴ>sudo 먼저 깔아야 함 > apt update > apt-get install aptitude -y >
ㄴ>이러고 aptitude install ufw하면 사용 가능.
apt는 로우레벨이라 더 많이 지식이 요구됨. aptitude는 패키지 작업을 자동화하여 보다 쉽게해줌
설치,제거,업데이트 등 충돌이 있을 경우 다른 대안을 제시해주는 기능도 있다고함. apt는 그냥 불가
apparmor vs SELinux >> apparmor vs selinux
ㄴ> 파일/경로별로 정책파일을 통해서 역량을 제한함. enforce모드 > 역량제한된 것은 하지 못하게
complain모드 > 역량제한된것을 한 경우 로그를 남김

[sudo와 root]
root는 거의 전능한 권한을 가진다.
sudo는 root와 유사하게 대부분의 권한을 가진 유저그룹.
특정 행동을 제한 할 수 있기 때문에 root와 유사하다 같다고는 할 수 없다.
행동을 제한할 수 있기는 함 > sudo제한

[visudo] >> sudo그룹의 설정 파일인 sudoers파일의 권장 수정 명령어
(동시에 수정되는 것을 막고, 잘못된 명령어 입력시 경고한다)
Defaults authfail_message="권한 획득 실패 메세지"
Defaults badpass_message="비밀번호 틀릴때 메세지"
Defaults iolog_dir="/var/log/sudo/"
Defaults log_input
Defaults log_output
Defaults requiretty
Defaults passwd_tries=3

secure_path >>> sudo명령어는 가상의 쉘에서 실행되는데, 그것의 경로.
이것을 설정하지 않는다면 외부에서 바이러스가 포함된 프로그램을 받게되면 path경로를 따로 설정해버리고
이 경로에는 해당 바이러스 프로그램의 명령어를 실행하도록 하는 명령어가 깔려있도록 함으로서 공격이 가능하다.

env_reset > home / path등을 빼고는 명령어 실행 때 모든 환경변수를 리셋한채로 실행하는 것.(최소의 환경에서 실행)
requiretty > 로그인 명령 하에 실행되도록 함. cron같은 매크로성 입력을 제한함.

[group]
사용자 추가 - adduser 사용자명
groupadd user42 로 user42 그룹 추가
usermod -aG user42 nhwang > user42그룹에 nhwang추가
groups nhwang > nhwang의 포함 그룹 확인
sudo deluser 사용자명 그룹명 >> 그룹에서 사용자를 제거
sudo userdel -r 사용자명 >>> 사용자 제거
grep '그룹명' /etc/group >> 속한 사용자 확인
/etc/group >>> 모든 그룹파일

[ufw]
ufw status verbose > 상태확인
ufw enable > on
ufw default deny > 디폴트?
ufw allow 4242 > 4242오픈

[ssh]
su -
apt install openssh-server 거의 대부분 이미 깔려있음
vim /etc/ssh/sshd_config
#Port 22 -> Port 4242 로 변경
#PermitRootLogin prohibit-password -> PermitRootLogin no 로 변경
systemctl restart ssh
systemctl status ssh

[root 명 변경] - sudo hostnamectl set-hostname 바꾸려는호스트명

[password]
설정경로 - vi /etc/login.defs
PASS_MAX_DAYS 30
PASS_MIN_DATS 2
PASS_WARN_AGE 7

정책 디테일 설정 패키지 다운 - apt-get -y install libpam-pwquality
설정경로 - vi /etc/pam.d/common-password

retry=3 뒤로,
minlen=10 ucredit=-1 lcredit=-1 dcredit=-1 maxrepeat=3 reject_username enforce_for_root difok=7


reject_username : username이 그대로 또는 뒤집혀서 새 패스워드에 들어있는지 검사하고, 들어있으면 거부
enforce_for_root : root 사용자가 패스워드를 바꾸려고 하는 경우에도 위의 조건들 적용
difok=7 : 기존 패스워드와 달라야하는 문자 수는 7


* 비밀번호 만료 시키기 passwd -e <사용자명>

사용자 비밀번호 변경 - sudo passwd 사용자명

[cron]
unix 계열 운영체제 (linux, MacOS 포함)를 사용하다보면 시간대별로 반복되는 작업들을 수행해야 하는 경우 사용되는 작업 스케쥴링

설정 -
sudo crontab -e 로 크론 설정 들어감
chmod +x monitoring.sh( X(대문자 X)는 권한 지정 대상이 "실행(x) 권한을 가져도 괜찮은 경우에만 실행 권한을 지정"하고자 할 때 사용합니다.) 크론탭 설명

| wall >> 모든 로그인한 사용자에게 메시지를 표시할 때 쓰는 명령어


분 시 일 월 요일 설정가능

매 주기마다 원할 경우 > */10 * * * * ::: 10분마다

[모니터링 스크립트]

apt-get -y install sysstat
vi /root/monitoring.sh

아래 내용 그대로 입력. 틈틈히 저장하고 출력 확인하면서 만들 것.

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 -a -BM | grep /dev/map | awk '{sum+=$3}END{print sum}' | tr -d '\n'
printf "/"
df -a -BM | grep /dev/map | awk '{sum+=$4}END{print sum}' | tr -d '\n'
printf "MB ("
df -a -BM | 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}'

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

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

printf "#Connections TCP : "
ss | grep -i 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}' | sed '2, $d' | tr -d '\n'
printf ")\n"

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

uname : 시스템의 정보를 출력
nproc : User당 사용할 수 있는 프로세스 최대 개수
$n : n번째 인자. $0은 전체를 나타냄. 출력물에 대해서는 string이 되겠다. (%s) %d로하면 0이 출력된다.
df : Disk space available on the File system [-Bsize] >>> -BM >> mega바이트 단위로 표시하겠다.
-gt : greater than
ss : socket statistics - 네트워크 상태를 보기 위해 사용되는 명령어
journalctl : 시스템 로그 보여주는 명령어 _COMM = sudo - 실행가능한 스크립트 (즉 명령어)인 경우에 커맨드 로 찾을 수 있음을 의미한다
ip link show :
sed '2, $d' > $는 마지막까지를 의미한다. (2행부터 마지막 행까지 d 삭제)
mpstat : CPU 리소스 사용율을 모니터링
grep -i 옵션 : 대소문자 무시

*nice(mpstat에서) : cpu가 후순위로 처리할 것이 있을 때 사용율
*steal(mpstat에서) : 하이퍼바이저가 다른 가상 프로세서에 의해 구동될 때 기다리는 시간을 위해 쓰이는 비율
*guest(mpstat에서) : 가상 프로세서가 실행하기 위해 사용되는 비율
*idle(mpstat에서) : 유효 cpu 백분율

하이퍼바이저 : 가상머신을 생성하고 구동하는 소프트웨어

*tty vs pts :
In laymen terms the primary difference between TTY and PTS is the type of connection to the computer. TTY ports are direct connections to the computer such as a keyboard/mouse or a serial connection to the device. PTS connections are SSH connections or telnet connections.
ㄴ> 비교해서 보면 편한데, who를 통해 볼 때 ssh 로그인은 pts로 나오게된다.

profile
42Seoul

0개의 댓글