Born2BeRoot

coh·2022년 12월 6일
0

Born2beroot

가상머신

하나의 컴퓨터 위에 물리적 자원을 가상화한 컴퓨팅 환경을 구축하여 어떤 os라도 설치할 수 있도록 하는 기술이다.

하이퍼바이저(hypervisor)

가상머신에 대한 추가 개념으로 하이퍼바이저가 있다. hypervisor는 실제 물리자원을 가상화하고 이를 가상머신이 사용할 수 있도록 하는 매개체 역할을 하는 소프트웨어이다.

hypervisor는 하드웨어를 직접 제어할 수 있기 때문에 가상의 하드웨어를 제공하고 VM의 life cycle관리, 실시간 자원할당, vm 정책 정의 등 다양한 기능을 수행한다.

하이퍼바이저는 타입1과 타입2가 나뉜다.
타입1은 native hypervisor라고 불리고 하드웨어와 직접 상호작용한다.
(bare metal이라고 불리기도 한다.)
타입2는 hosted hypervisor라고 불리며 이름대로 호스트 운영체제 위에서 동작한다. 과제에서 요구하는 virtual box가 타입2에 해당한다.

CentOS vs Debian

virtual box를 설치 후에 서버용 운영체제를 선택해야 한다.

centos는 기업용으로 주로 사용하고 red hat enterprise linux를 사용한다. red hat 로고만 제거한 배포판. 업데이트가 느리고 개인이 다루기 어렵다.
debian은 개인용으로 centos보다 사용하기 쉽다. 우분투나 kali 등이 해당되고, 초보 리눅스 사용자일 경우 debian 권장

가상머신의 목적

여러 가상 환경을 하나의 하드웨어에 설치하므로 물리적 공간과 유지보수하는 데에 드는 비용을 아낄 수 있다.

apt / aptitude / apparmor

  1. apt(advanced packaging tool)은 데비안 사용에 필요한 각종 소프트웨어를 설치하기 위해 필요한 CLI용 패키지 관리 툴.
  • 무료 오픈소스이고 로우 레벨이지만 자유도가 높으며 프로그램 충돌 시 충돌 패키지 자동 제거 옵션으로 -auto-remove 등이 필요하다. 마지막으로 apt는 다른 고수준 패키지매니저에 의해 사용될 수 있다.
  1. aptitude : apt보다 기능이 더 많고, 편리한 high level 패키지 매니저이다. 사용자 인터페이스를 추가해 대화형으로 패키지를 검색하고 설치 및 제거를 할 수 있다. 사용하지 않는 패키지를 자동적으로 제거해주거나 설치, 제거, 업데이트 과정에 충돌이 있을 경우 다른 대안을 함께 제시해준다.

  2. apparmor(application armor) :시스템 관리자가 프로그램 프로필별로 프로그램 보안을 세팅할 수 있게 해주는 리눅스 커널 보안 모듈이다.
    mandatory access control(mac)로 관리자가 특정 프로그램에 대한 네트워크, 소켓, 입출력 등에 대한 접근을 제한할 수 있게 한다.

  • mac : 강제접근제어. 정의된 정책을 사용하여 사용자와 프로세스의 행동을 제어

apparmor는 enforce 모드와 complain 모드 두 가지가 존재한다.

enforce : 접근 제한. 로그 남김.
complain : 제한은 안 하지만 로그는 남김.

apparmor 확인.

$sudo aa-status

#활성화 여부 확인
$sudo aa-enabled

script표시(every 10 min)

나중에 monitoring.sh 설명하면서 좀더 자세히 설명.

crontab -e

wall 명령어는 모든 유저에게 메시지를 보낼 때 사용한다. 메시지로는 파일의 내용이나 기본입력, 유저의 최근 로그 기록 등을 화면에 출력한다.

Simple setup.

-CLI 이고 machine에 연결 시 password 요구되는지. 루트가 아닌 유저에 연결되는지.
-password policy체크

UFW service check

sudo ufw status

SSH service check

systemctl status ssh

Check operating system

cat /etc/os-release #OS확인

User

평가받는 학생의 유저가 sudo, user42에 속해있는가?

id <username>

새유저 생성 후 pw policy에 맞는 pw설정.

sudo adduser <username>

password period

sudo vi /etc/login.defs : PW주기 설정 및 확인 30, 2, 7 확인. 

비밀번호 최대 사용기간과 최소사용기간 그리고 경고 메시지 기간(만료 전 x일 전부터 경고 보내기)과 비밀번호 길이 설정이 가능.

sudo vi /etc/shadow : root 에서 비밀번호가 변경된 것을 확인 (2 : 30 : 7)

password rulse

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

retry=3 : 암호 재입력은 최대 3회
minlen=10 : 최소 길이 10
difok=7 : 기존 패스워드와 달라야 하는 문자 수 7
maxrepeat=3 : 동일한 문자를 반복 가능한 최대 횟수 3
ucredit=-1 : 대문자 한개 이상 포함
lcredit=-1 : default가 1로 설정되어 있어서 소문자가 포함된 비밀번호의 갯수가 9개일 경우 10개로 취급된다. 따라서 0으로 설정.
//subject가 바뀌어서 lcredit을 -1로 설정해야한다.
dcredit=-1 : digit 한개 이상 포함
reject_username : username이 그대로 혹은 reversed 된 문자는 패스워드로 사용 불가
enforce_for_root : root 계정도 위의 정책들 적용

passwd <username> #암호 변경시키기.
chage -m 2 -M 30 -W 7 <username>
chage : 사용자 패스워드 만기일 설정하거나 변경하는 명령어
-m:비번 변경 후 다시 변경할 수 있는 최소 날짜 설정 옵션
-M:비번이 유효한 최대 날짜 설정 옵션
-W:경고메시지 기간 설정 옵션

장 : 보안 확실하네~
단 : 귀찮네~

그룹 생성과 user 집어넣기

sudo groupadd <groupname>
sudo usermod -aG <groupname> <username> #user를 그룹에 집어넣기
sudo id <username>

G 옵션:
명시된 그룹에만 속하게 됨

a 옵션:
기존 속했던 그룹 + 명시된 그룹에 속하게 된다.

Hostname, and partitions

hostname 체크, 변경, 재시작

hostnamectl coh42인지 체크
sudo hostnamectl set-hostname <HOSTNAME> #hostname변경
sudo reboot #재시작
그 후 호스트네임 복원

partition 확인

lsblk #파티션 체크

LVM

LVM은 물리적인 디스크를 논리적인 디스크로 할당하여 유연하게 관리할 수 있게 해준다. 즉, 여러 개의 하드디스크 공간을 합쳐서 하나의 디스크처럼 사용할 수 있고 기존에 사용중인 디스크의 공간을 자유롭게 확장할 수 있다.

  1. 하드 디스크를 여러 개로 나누어 파티션을 설정한다.
  2. 각 파티션을 LVM으로 사용하기 위해 PV(physical volume)으로 변환한다.
    -LVM이 PV를 가리키는 단위는 물리적 범위(PE)로 기본 4Mb이다.
  3. 하나 이상의 PV를 그룹화하여 VG(volume group)으로 만든다.
  4. 가상의 파티션처럼 물리그룹을 나누어 할당한 것이 LV(논리볼륨)이다.
    -LVM이 LV를 가리키는 단위는 논리적 범위(LE)로 기본 4Mb이다.
  5. LV를 새 파일시스템(마운트포인트)과 1:1로 마운트한다.
    -file system = 파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관하는 것

SUDO

sudo 설치 확인

dpkg -l sudo

새 유저 sudo 그룹에 할당하기

sudo usermod -aG sudo <username>

visudo

sudo visudo

Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
# 보안을 위해 secure_path(sudo가 사용할 수 있는 경로)를 제한.
#secure_path: sudo는 현재 쉘이 아니라 가상 쉘을 생성하고 실행되는데 이 때 가상 쉘의 path.
`/bin:/sbin` # bin에 없으면 sbin에서 찾아라. 

Defaults        authfail_message="Authentication fail"
# (sudo)권한 획득 실패 시 출력

Defaults        badpass_message="Password fail"
# sudo인증에서 password 틀리면 출력

Defaults        iolog_dir="/var/log/sudo"
# sudo log(input, output) 저장디렉토리 설정.

Defaults        log_input
# sudo 명령어 실행 시 입력된 명령어를 iolog_dir에 log로 저장

Defaults        log_output
# sudo 명령어 실행 시 출력 결과를 iolog_dir에 log로 저장

Defaults        requiretty
# sudo 사용 시 tty(콘솔, 터미널)실행 강제.

Defaults        passwd_tries=3
# 일치하지 않는 password인 경우 입력은 3회로 제한.

/var/log/sudo/00/00 #sudo 명령어 하나마다 하나의 폴더가 생성되고 총 7개의 log파일이 존재.

  • 추가정보. 만약 물어본다면..
    log: sudo 실행 시 실행한 위치와 실행한 명령어의 위치 저장
    stderr: sudo로 실행한 명령어가 오류로 인해 실행되지 않았을 경우 출력되는 내용 저장
    stdin: sudo로 실행한 명령어가 표준 입력을 받은 내용 저장
    stdout: sudo로 실행한 명령어가 표준 출력으로 결과를 출력한 내용 저장
    timing: session(세션)이 실행된 시간 저장
    ttyin: sudo로 실행한 명령어가 tty로 입력받은 내용 저장
    ttyout: sudo로 실행한 명령어가 tty로 출력한 결과가 저장

sudo 장점

root권한을 빌려서 sudo를 사용하면 다음과 같은 장점이 있다.

  • 침입자가 sudo사용시 log가 남아 추적이 가능하다.(root에선 log안 남음)
  • root계정에서 위험한 명령을 치지 않을 수 있다.
  • root 타인과 공유하지 않아도 되기에 pw를 관리하기가 편하다.

UFW

UFW와 사용하는 이유

방화벽은 네트워크 통로를 단일화하여 내부의 정보 자산을 보호한다.
1. UFW는 데비안 및 리눅스 계열에서 작동되는 사용하기 쉬운 방화벽 관리 프로그램이고 프로그램 구성으로 iptables을 사용한다.
2. iptables는 리눅스에서 방화벽을 설정하는 도구인데 netfilter packit filtering기능을 사용자 수준에서 제어할 수 있게 도와준다.
3. 패킷은 헤더와 내용으로 구성되어 있는데 헤더를 보고 필터링하는 것이 netfilter!
근데 이 iptables 사용이 번거롭기 때문에 이를 간편하게 해주기 위해 UFW가 등장한 것이다.

sudo ufw status verbose #Check ufw status
sudo ufw status numbered #Verify rules with numbering
sudo ufw delete <rules to be deleted> #Delete ufw rules

sudo ufw enable
sudo ufw default deny
sudo ufw allow 4242

Ipv4는 8비트씩 4자리로 이루어져 있어서 총 2^32, 약 43억 개의 주소를 가질 수 있다. 따라서 부족한 (공인)IP주소를 해결하기 위해 하나의 공인 IP아래에 여러 개의 사설 IP를 두어 활용하게 된다. 집에 있는 공유기를 생각하면 된다! 공유기에 연결된 가정집의 수많은 스마트폰, 노트북 등등..

또한 IPv4가 바닥날 것을 생각하여 총 128비트의 IPv6도 나오게 되었고 현재는 v4, v6를 혼용해서 쓰고 있다.

근데 사설 IP는 공인 IP와 달리 고유하지 않기 때문에 외부에서 그 사설 IP컴퓨터로 접속할 수가 없다. 이를 해결하기 위해 공인 IP의 port를 개방하고 각 port를 사설 IP에 하나씩 연결할 수 있는데 이를 port forwarding이라고 한다.

port는 컴퓨터 Lan선은 하나인데 통신을 필요로 하는 프로그램이 여러 개일 때 프로세스를 구분하는 식별자이다.

Check UFW rule list (Port4242)

sudo ufw status numbered

Add port 8080 & verifying

sudo ufw allow 8080
sudo ufw status numbered

delete rule

sudo ufw delete <rule number to be deleted>

SSH(Secure shell)

  1. 컴퓨터와 컴퓨터가 인터넷과 같은 public network를 통해 서로 통신을 할 때 사용하는 보안 프로토콜이다.
  2. 한 쌍의 key(공개키, 비밀키)를 이용하여 데이터를 암호화, 복호화한다.

SSH는 접속 시 한 쌍의 key를 통해 접속하려는 컴퓨터와 인증과정을 거치게 되는데 public key를 통해 메시지를 전송하기 전 암호화를 하고 본인의 컴퓨터에 저장된 private key로 복호화한다.

SSH설정 port4242 이용확인

sudo vi /etc/ssh/sshd_config #ssh 설정 변경. sshd는 server측일 때 설정이다.

SSH를 이용해 새 user로 login하기

ssh coh@<Mac IP> -p <Host Port>

monitoring.sh

awk 명령어 review
https://recipes4dev.tistory.com/171
https://saelly.tistory.com/477

shell if문
https://rhrhth23.tistory.com/41
-gt옵션은 전자가 후자보다 크면 참.
fi는 종료를 알리는 말.

print에는 개행이 포함되어 있음.
printf는 없어서 필요시 "\n"포함.

ip link show
https://zidarn87.tistory.com/584?category=417570

uname -a #system 정보를 출력
-a : p와 i 옵션을 제외한 모든 정보
-s : 커널 이름
-n : 네트워크의 호스트
-r : 커널의 릴리즈 정보
-v : 커널의 버전
-m : 시스템의 하드웨어 타입
-p : 프로세스 종류
-o : 운영체제 이름
-i : 하드웨어 플랫폼 정보

nproc --all #물리적으로 설치된 프로세스 갯수

cat /proc/cpuinfo | grep processor | wc -l #cpu정보가 담긴 파일에서 프로세서의 갯수

free -m #메모리 사용량을 mb단위(-m)로 출력한다.

df -a -Bm #파일시스템 내 디스크 공간을 출력. -a는 0블록의 파일시스템을 포함해 모든 파일 시스템을 출력하고 -Bm은 크기를 1M블록으로 지정해서 출력하게 된다.

mpstat #현재 CPU의 사용량을 출력한다.

who -b #마지막 리부트 날짜와 시간.

ss | grep -i tcp #ss 는 옵션없이 사용하면 현재 연결되어 있는 모든 네트워크를 표시.
-i옵션은 대소문자 구분없이 특정 문자열을 찾는다.

who #서버를 사용하는 유저들을 출력한다.

hostname -I #IPv4 주소

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}'

used_disk=$(df -a -Bm | grep -v Filesystem | awk '{sum+=$3}END{printf sum}')
total_disk=$(df -a -Bm | grep -v Filesystem | awk '{sum+=$2}END{printf sum}')

printf "#Disk Usage: ${used_disk}/${total_disk}MB "
df -a -BM | grep -v Filesystem | awk '{sum1+=$3 ; sum2+=$2 }END{printf "(%d%%)\n", sum1 / sum2 * 100}'

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') ESTABLISHED\n"

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

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

sudo를 출력하는 것은 총 2가지 방법을 생각해봤다. 
1. 첫 번째는 실행이 된 sudo갯수를 보는 것 
cd /var/log/sudo/00/00
cnt=$(ls -l | grep -v total | wc -l)
printf "#Sudo : $cnt cmd\n"

2. 두 번째는 시도된 모든 sudo갯수를 보는법. 권한실패로 실행되지 않은 sudo 갯수도 cnt된다. 
journalctl은 log data를 볼 수 있는 명령어이다. 
printf "#Sudo : $(journalctl _COMM=sudo | awk '{print $5}' | uniq | grep sudo | wc -l) cmd\n"

cron

특정 작업을 특정 시간에 자동으로 실행시키기 위한 시간기반 job schedule형 데몬.
cron은 crontab이라는 설정파일을 기반으로 작동한다.
데몬은 사용자가 직접적으로 제어하지 않고 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다. 백그라운드 프로세스와 다른 점은 사용자와 상호작용하지 않는 독자적인 프로세스란 것이다.

crontab -e

* * * * * command 
| | | | |_ // 요일
| | | |_ // 월
| | |_ // 날짜
| |_ // 시간
|_ // 분

# 9일~15일 5시 6시에 매 10분마다 monitoring.sh 를 실행
*/10 5,6 9-15 * * /home/monitoring.sh

# 10분마다 monitoring.sh를 실행
*/10 * * * * /monitoring.sh

- # 그 사이 모든 값
, # 지정 값
/ # 특정 주기로 나누기

서버 시작 시 script 실행 안 되게 수정하기

sudo systemctl disable cron
sudo reboot
sudo service cron status
sudo systemctl enable cron

기타 개념들

-tty
tty is short of teletype, but popularly known as a terminal it allows you to interact with the system by passing on the data (you input) to the system, and displaying the output produced by the system.

->teletype의 줄임말인데 터미널이라고 생각하면 됨.

profile
Written by coh

0개의 댓글