Virtual Machine
하나의 물리 서버를 보다 효율적으로 사용하기 위해 사용
defense 준비
https://dc-choi.tistory.com/55
물리적으로 1대인 컴퓨터에서 마치 여러 대의 컴퓨터로 운영하는 것과 같은 환경을 제공해주는 소프트웨어
고로, 각 운영체제 환경은 격리상태에서 동일한 하드웨어에서 병렬실행 가능함 (자원의 낭비를 줄인다.)
CentOS = 기업용으로 주로 사용하며 RHEL(Red Hat Enterprise Linux)을 그대로 가져옴. 간단히 말해 Redhat 체험판으로 보면 됨. 다만 업데이트가 느리고 개인이 다루기 어려움.
Debian = 개인용으로 CentOS보다 사용하기 쉬움. Debian 계열로는 Ubuntu, Kali 등이 있음. 문제 요구사항에서 초보자일 경우 데비안을 선택할 것을 추천.
Redhat 계열로 CentOS 외에 Fedora, Oracle 등이 있음.
AppArmor(Application Armor)는 시스템 관리자가 프로그램 프로필 별로 프로그램 보안을 세팅할 수 있게 해주는 리눅스 커널 보안 모듈이다.
Mandatory Access Control(MAC)로 관리자가 특정 프로그램에 대한 네트워크, 소켓, 입출력 등에 대한 접근을 제한할 수 있게 한다.
앱아머 프로필은 /etc/apparmor.d 디렉토리에 저장된다.두가지 모드가 있다.
Enforce mode – 로그를 남김과 동시에 제한을 강제한다.
Complain mode – 제한은 안 하지만 로그를 남긴다.
AppArmor 실행확인
$ sudo apparmor_status //앱아머 상태보기(또는 $sudo aa-status)
$ sudo aa-enabled //활성화 여부 확인
현재 password 정책 설명 : sudo vi /etc/login.defs
패스워드 정책을 설정하기 위해 패스워드 만료 모듈 설치
sudo apt install libpam-pwquality
설정하고 싶은 패스워드 정책 추가
sudo vi /etc/pam.d/common-password
retry=3
: 암호 입력 3회 까지minlen=10
: 암호 최소 길이 10difok=7
: 기존 암호와 달라야 하는 문자수 7ucredit=-1
: 대문자 1개 이상lcredit=-1
: 소문자 1개 이상dcredit=-1
: 숫자 1개 이상maxrepeat=3
: 최대 3글자까지 중복된 문자 연속 사용 가능reject_username
: username이 그대로 또는 뒤집혀서 패스워드에 들어있는지 검사, 들어있으면 거부enforce_for_root
: 해당 비밀번호 정책을 root에도 적용$ passwd -e [user_name]
- 비밀번호를 강제적으로 변경해야 한다.
$ chage -m 2 -M 30 -W 7 [user_name]
- 비밀번호 기간 정책을 설정한다.
- m : 패스워드 변경 후 다시 변경할 수 있는 최소 날짜 설정 옵션
- M : 패스워드가 유효한 최대 날짜 설정 옵션
- W : 경고 메세지 기간 설정 옵션
- chage -l : 확인
수정 후 비밀번호 관련 설정들이 저장된 sudo vi /etc/shadow 에 들어가보면
$ sudo vi /etc/shadow
$ cat /etc/group : 그룹 조회
$ groupadd [그룹명] : 그룹 추가
$ groupdel [그룹명] : 그룹 삭제
$ groupmod -n [그룹명][새 그룹명] : 그룹명 수정
$ usermod -aG [그룹명,그룹명, ... ][사용자명] : 사용자를 그룹에 추가
$ usermod -g [그룹명][사용자명] : primary group 설정
$ id [사용자명] : 사용자의 gruop 확인
hostnamectl
sudo hostnamectl set-hostname [새로운 호스트명]
변경 후 restart lsblk
sudo 설치 : apt install sudo
sudo 설치 여부 확인 dpkg -l sudo
(dpkg : package manager for Debian)
새로운 사용자 sudo 그룹에 추가 sudo usermod -aG sudo [새로운 사용자명]
sudo에 대한 엄격한 규칙, sudo 사용하는 가치, 사용하는 이유, 작동 원리
/var/log/sudo를 통해 확인 sudo visudo
static.com/9e84c98b-75a8-4834-9719-d722618b0e0e/Untitled.png)
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
: 보안상 이유로 sudo 실행 시 사용할 수 있는 명령어의 경로는 제한되어야 함
authfail_message=
: 권한 획득 실패 시 출력하는 메시지 (sudo 인증 실패)
baspass_message
: 비밀번호를 틀렸을 시 출력하는 메시지
log_input
: sudo 명령어 실행 시 입력된 명령어를 log로 저장
log_output
: sudo 명령어 실행 시 출력 결과를 log로 저장
requiretty
: sudo 명령어 실행 시 TTY에서만 실행 가능
iolog_dir="/var/log/sudo/"
: sudo log 저장 디렉토를 지정
passwd_tries=3
: sudo 비밀번호 인증 횟수 지정 (기본값은 3)
log의 경우 /var/log/sudo/00/00
에서 확인할 수 있으며 sudo 명령어 하나마다 하나의 폴더가 생성된다.
폴더에는 총 7개의 log 파일이 존재한다.
log
stderr
stdin
stdout
timing
ttyin
ttyout
sudo ufw status verbose
sudo ufw status numbered
sudo vi /etc/ssh/sshd_config
Port 8080sudo ufw delete allow 8080
apt search openssh-server
apt install openssh-server
systemctl status ssh
vi /etc/ssh/sshd_config
`#Port 22 --- 제거ss -tunpl
명령어로 정보 확인 ip addr show
/ ip address https://nostressdev.tistory.com/3
분 시 일 월 요일 명령
$ systemctl status cron.service # status check
$ sudo service cron start # start
$ /etc/init.d/cron start # 멈추기
$ sudo systemctl disable cron # 재부팅 후에 멈추기
$ /etc/init.d/cron stop # stop
$ sudo service cron stop # stop
$ sudo crontab -e # edit
$ sudo crontab -l # list
#!/bin/bash
printf "#Architecture: "; uname -a
시스템 정보 출력 , -a : 커널 이름, 네트워크 호스트명 및 운영체제등을 출력
printf "#CPU physical : "; nproc --all
설치된 모든 프로세서 수
printf "#vCPU : "; cat /proc/cpuinfo | grep processor | wc -l
CPU 정보가 담겨 있는 파일 중 프로세스만 찾아 개수를 출력
코어개수?
printf "#Memory Usage: "; free -m | grep Mem | awk '{printf"%d/%dMB (%.2f%%)\n", $3, $2, $3/$2 * 100}'
free: 시스템 메모리 사용 현황 출력 명령어-m: 메가바이트 단위로 표시
printf "#Disk Usage: "; df -a -BM | grep /dev/map | awk '{sum+=$3}END{print sum}' | tr -d '\n'
df: 파일시스템 디스크 공간의 사용량을 출력하는 명령어
-a: 0 블록의 파일시스템을 포함해 모든 파일시스템을 출력하는 옵션
-B: 지정한 크기(SIZE)를 블록단위로 정하여 용량 표시하는 옵션
-BM: 크기를 1M으로 블록단위를 정해 용량을 표시
-BM: 크기를 1G로 블록단위를 정해 용량을 표시
printf "/"; df -a -BG | grep /dev/map | awk '{sum+=$4}END{print sum}' | tr -d '\n'
printf "GB ("; 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}'
mpstat: 사용가능한 CPU와 Core 별 사용량을 출력하는 명령어 (sysstat 설치 필요)
printf "#Last boot: "; who -b | awk '{printf $3" "$4"\n"}'
who: 호스트에 로그인한 사용자 정보 출력
-b: 마지막 시스템 부팅 시간을 출력하는 옵션
printf "#LVM use: "; if [ "$(lsblk | grep lvm | wc -l)" -gt 0 ] ; then printf "yes\n" ; else printf "no\n"
fi
[ -gt ] : 값1 > 값2
printf "#Connections TCP : "; ss | grep -i tcp | wc -l | tr -d '\n'
ss: 소켓 상태를 조회할 수 있는 유틸리티로 netstat와 비슷한 역할을 수행한다.
-i : 대소문자 구분 없이
printf " ESTABLISHED\n";
printf "#User log: "; who | wc -l
who: 호스트에 로그인한 사용자 정보 출력
printf "#Network: IP "; hostname -I | tr -d '\n'
hostname: 시스템 이름을 확인하고 설정하는 명령어
-I: 호스트의 IP 주소를 출력하는 옵션
printf "("; ip link show | awk '$1 == "link/ether" {print $2}' | sed '2, $d' | tr -d '\n'
ip link: 네트워크 인터페이스를 표시
show: 관련 인터페이스 출력한다.
printf ")\n";
printf "#Sudo : "; journalctl _COMM=sudo | grep COMMAND | wc -l | tr -d '\n'
journalctl: systemd의 서비스 로그를 확인할 수 있고 systemd-journald.service에 의해서 systemd의 정보들을 분석한다.
_COMM=sudo: 특정로그(sudo) 보기
printf " cmd\n";