Born2beroot
가상머신
하나의 컴퓨터 위에 물리적 자원을 가상화한 컴퓨팅 환경을 구축하여 어떤 os라도 설치할 수 있도록 하는 기술이다.
가상머신에 대한 추가 개념으로 하이퍼바이저가 있다. hypervisor는 실제 물리자원을 가상화하고 이를 가상머신이 사용할 수 있도록 하는 매개체 역할을 하는 소프트웨어이다.
hypervisor는 하드웨어를 직접 제어할 수 있기 때문에 가상의 하드웨어를 제공하고 VM의 life cycle관리, 실시간 자원할당, vm 정책 정의 등 다양한 기능을 수행한다.
하이퍼바이저는 타입1과 타입2가 나뉜다.
타입1은 native hypervisor라고 불리고 하드웨어와 직접 상호작용한다.
(bare metal이라고 불리기도 한다.)
타입2는 hosted hypervisor라고 불리며 이름대로 호스트 운영체제 위에서 동작한다. 과제에서 요구하는 virtual box가 타입2에 해당한다.
virtual box를 설치 후에 서버용 운영체제를 선택해야 한다.
centos는 기업용으로 주로 사용하고 red hat enterprise linux를 사용한다. red hat 로고만 제거한 배포판. 업데이트가 느리고 개인이 다루기 어렵다.
debian은 개인용으로 centos보다 사용하기 쉽다. 우분투나 kali 등이 해당되고, 초보 리눅스 사용자일 경우 debian 권장
여러 가상 환경을 하나의 하드웨어에 설치하므로 물리적 공간과 유지보수하는 데에 드는 비용을 아낄 수 있다.
aptitude : apt보다 기능이 더 많고, 편리한 high level 패키지 매니저이다. 사용자 인터페이스를 추가해 대화형으로 패키지를 검색하고 설치 및 제거를 할 수 있다. 사용하지 않는 패키지를 자동적으로 제거해주거나 설치, 제거, 업데이트 과정에 충돌이 있을 경우 다른 대안을 함께 제시해준다.
apparmor(application armor) :시스템 관리자가 프로그램 프로필별로 프로그램 보안을 세팅할 수 있게 해주는 리눅스 커널 보안 모듈이다.
mandatory access control(mac)로 관리자가 특정 프로그램에 대한 네트워크, 소켓, 입출력 등에 대한 접근을 제한할 수 있게 한다.
apparmor는 enforce 모드와 complain 모드 두 가지가 존재한다.
enforce : 접근 제한. 로그 남김.
complain : 제한은 안 하지만 로그는 남김.
apparmor 확인.
$sudo aa-status
#활성화 여부 확인
$sudo aa-enabled
나중에 monitoring.sh 설명하면서 좀더 자세히 설명.
crontab -e
wall 명령어는 모든 유저에게 메시지를 보낼 때 사용한다. 메시지로는 파일의 내용이나 기본입력, 유저의 최근 로그 기록 등을 화면에 출력한다.
-CLI 이고 machine에 연결 시 password 요구되는지. 루트가 아닌 유저에 연결되는지.
-password policy체크
sudo ufw status
systemctl status ssh
cat /etc/os-release
#OS확인
id <username>
sudo adduser <username>
sudo vi /etc/login.defs : PW주기 설정 및 확인 30, 2, 7 확인.
비밀번호 최대 사용기간과 최소사용기간 그리고 경고 메시지 기간(만료 전 x일 전부터 경고 보내기)과 비밀번호 길이 설정이 가능.
sudo vi /etc/shadow : root 에서 비밀번호가 변경된 것을 확인 (2 : 30 : 7)
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:경고메시지 기간 설정 옵션
장 : 보안 확실하네~
단 : 귀찮네~
sudo groupadd <groupname>
sudo usermod -aG <groupname> <username>
#user를 그룹에 집어넣기
sudo id <username>
G 옵션:
명시된 그룹에만 속하게 됨
a 옵션:
기존 속했던 그룹 + 명시된 그룹에 속하게 된다.
hostnamectl
coh42인지 체크
sudo hostnamectl set-hostname <HOSTNAME>
#hostname변경
sudo reboot
#재시작
그 후 호스트네임 복원
lsblk
#파티션 체크
LVM은 물리적인 디스크를 논리적인 디스크로 할당하여 유연하게 관리할 수 있게 해준다. 즉, 여러 개의 하드디스크 공간을 합쳐서 하나의 디스크처럼 사용할 수 있고 기존에 사용중인 디스크의 공간을 자유롭게 확장할 수 있다.
dpkg -l sudo
sudo usermod -aG sudo <username>
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파일이 존재.
root권한을 빌려서 sudo를 사용하면 다음과 같은 장점이 있다.
방화벽은 네트워크 통로를 단일화하여 내부의 정보 자산을 보호한다.
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선은 하나인데 통신을 필요로 하는 프로그램이 여러 개일 때 프로세스를 구분하는 식별자이다.
sudo ufw status numbered
sudo ufw allow 8080
sudo ufw status numbered
sudo ufw delete <rule number to be deleted>
SSH는 접속 시 한 쌍의 key를 통해 접속하려는 컴퓨터와 인증과정을 거치게 되는데 public key를 통해 메시지를 전송하기 전 암호화를 하고 본인의 컴퓨터에 저장된 private key로 복호화한다.
sudo vi /etc/ssh/sshd_config
#ssh 설정 변경. sshd는 server측일 때 설정이다.
ssh coh@<Mac IP> -p <Host Port>
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"
특정 작업을 특정 시간에 자동으로 실행시키기 위한 시간기반 job schedule형 데몬.
cron은 crontab이라는 설정파일을 기반으로 작동한다.
데몬은 사용자가 직접적으로 제어하지 않고 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다. 백그라운드 프로세스와 다른 점은 사용자와 상호작용하지 않는 독자적인 프로세스란 것이다.
* * * * * command
| | | | |_ // 요일
| | | |_ // 월
| | |_ // 날짜
| |_ // 시간
|_ // 분
# 9일~15일 5시 6시에 매 10분마다 monitoring.sh 를 실행
*/10 5,6 9-15 * * /home/monitoring.sh
# 10분마다 monitoring.sh를 실행
*/10 * * * * /monitoring.sh
-
# 그 사이 모든 값
,
# 지정 값
/
# 특정 주기로 나누기
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의 줄임말인데 터미널이라고 생각하면 됨.