SUDO

sudo란?

Super User Do 혹은 Substitute User Do의 약자로 유닉스 계열의 운영체제에서 루트가 아닌 다른 유저에게 제한적으로 관리자 권한을 부여

/etc/sudoers 설정 파일에 명시되어 있는 유저만 사용 가능

 

sudo의 장점

시스템 침입자가 sudo를 사용하게 되면 sudoers에 자신이 노출되기에 침입을 확인할 수 있음

root 계정에 장시간 머무를 일이 없어져, 위험한 명령을 실행할 가능성이 낮아짐

root와 달리 log가 남아서 추적이 쉬움

root의 password를 타인과 공유 하지 않아도 됨

 

sudo 설정

#root 계정 전환
su -

#sudo 패키지 설치
apt-get install sudo

#sudo 패키지 확인
dpkg -l | grep 'sudo'

#sudo log를 저장할 디렉토리 생성
mkdir /var/log/sudo

#/etc/sudoers 파일 수정
visudo

#이 부분을 수정
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

Defaults	authfail_message="Authentication attempt failed custom."
Defaults	badpass_message="Wrong password custom."
Defaults	log_input
Defaults	log_output
Defaults	requiretty
Defaults	iolog_dir="/var/log/sudo/"
Defaults	passwd_tries=3

/etc/sudoers를 수정하기 위해 visudo 사용

직접 /etc/sudoers 파일을 편집하다 실수가 발생하면 sudo를 사용할 수 없기에, 문법체크를 해주는 visudo를 사용

 

  • authfail_message : sudo 인증 실패시 출력할 메세지
  • badpass_message : sudo 비밀번호 오류 시 출력할 메세지
  • log_input : sudo 명령어 실행 시 입력된 명령어를 log로 저장
  • log_output : sudo 명령어 실행 시 출력 결과를 log로 저장
  • requiretty : sudo 명령어 실행시 tty를 강제함
  • iolog_idr : sudo log를 저장할 디렉토리 지정
  • passwd_tries : sudo 실행 횟수를 지정. defualt값은 3

 

*tty : 리눅스의 콘솔 및 터미널을 의미. tty 모드를 활성화 하면, 터미널을 할당하지 않는 상태에서는 sudo 명령어를 실행X 

 

sudo log 확인

/var/log/sudo/00/00에서 확인 가능

sudo 명령어 1개 당 1개의 폴더가 생성되며, 폴더에는 7개의 log 파일이 존재

 

  • log : sudo 실행 시 실행한 위치와 실행한 명령어의 위치가 저장
  • stderr : sudo로 실행한 명령어가 오류로 인해 실행되지 않았을 시 출력되는 내용이 저장
  • stdin : sudo로 실행한 명령어가 표준 입력을 받은 내용이 저장
  • stdout : sudo로 실행한 명령어가 표준 출력으로 결과를 출력한 내용이 저장
  • timing : session timing file
  • ttyin : sudo로 실행한 명령어가 tty로 입력받은 내용이 저장
  • ttyout : sudo로 실행한 명령어가 tty로 출력한 결과가 저장

 

 

UFW

UFW란?

Uncomplicated Firewall의 약자로, 리눅스에 기본적으로 존재하지만 절차가 복잡한 iptables대신 간소화해주는 소프트웨어

즉, 복잡하지 않은 방화벽이자 Ubuntu의 기본적인 방화벽 구성 도구

IPv4 또는 IPv6 호스트 기반 방화벽을 만들 수 있는 사용자 친화적인 방법 제공

간단한 명령 및 명령수가 적은 명령줄 인터페이스 사용

 

기본 명령어

#ufw 설치
sudo apt install ufw

#상태 확인
sudo ufw status verbose

#부팅 시 ufw 활성화
sudo ufw enable

#규칙 등록
sudo ufw allow 포트번호

#규칙 번호 확인
sudo ufw status numbered

#규칙 조회
sudo cat /etc/ufw/user.rules

#규칙 삭제
sudo ufw delete 포트번호

 

 

SSH

SSH란? 

Secure Shell Protocol의 약자로 컴퓨터간의 public network에서 통신할 때, 안전하게 통신할 수 있도록 해주는 보안 프로토콜

기존의 사용하던 Talnet 대신, 암호화 기능을 추가한 SSH를 사용

 

SSH 작동 방식

한 쌍의 key를 통해 접속하고자 하는 컴퓨터와 인증 과정을 거치고, 안전한 통신 채널을 만듦

클라이언트가 키를 생성하면 public key(공개키), private key(개인 키)가 만들어짐

공개키를 서버에 복사하여 저장

 

*public key : 메세지를 전송하기 전 암호화

private key : 암호화된 메세지를 복호화

 

1. 클라이언트가 통신하고자 하는 서버에 요청을 보냄

2. 서버가 저장하고 있던 공개키를 보냄

3. 클라이언트는 받은 공개키와 개인키가 한 쌍인지 검사

4. 맞으면 두 컴퓨터 사이에 암호화 된 채널이 생성

 

public key를 해커가 알아냈더라도 private key가 없으면 접근을 할 수 없기에 보안적으로 더 안전

 

SSHD

SSH Daemon의 약자로, SSH의 연결을 받아주기 위해 대기하는 프로세스

 

ssh : 나가는 요청

sshd : 들어오는 요청

 

 

SSHD 설정

#openssh 설치 확인
apt -installed list openssh-server

#openssh 설치
apt install openssh-server

#sshd_config 파일 수정
sudo vim /etc/ssh/sshd_config

#이 부분 변경
port 4242
PermitRootLogin no


#재시작
sudo systemctl restart ssh

#ssh 확인
systemctl status ssh

PermitRootLogin : 원격 접속시 root 로그인 가능 여부

(no를 했는데도, root가 아닌 일반 사용자로 접속 후 root로 로그인을 하면 접속이 됨 

=> 원격 접속 시에만 root 로그인을 막아주기 때문) 

 

Port Forwarding

특정한 포트로 들어오는 데이터 패킷을 다른 포트로 바꿔서 전송해줌

네트워크와 원격 기기 사이를 직접적으로 연결할 때 유용

 

Port Forwarding 설정

VirtualBox 설정의 network에서 설정

Host IP : 127.0.01 또는 맥 터미널에서 ifconfig | grep inet에서의 값

Host Port : 임의의 값

Guest IP : VirtualBox에서 hostname -I 의 값 

Guest Port : 4242

(보너스 파트에서 lighttpd를 사용 했기에 80도 추가하기)

 

#VirtualBox에서 연결
ssh -p 4242 아이디@VirtualBox주소

#Mac에서 연결
ssh -p 4242 아이디@mac주소

 

 

Script Monitoring

Shell Script 작성

  • 운영체제의 아키텍처 및 커널 버전
  • 물리적 프로세서의 수
  • 가상 프로세서의 수
  • 서버의 현재 사용 가능한 RAM과 활용률
  • 서버의 현재 가용 메모리와 활용률
  • 프로세서의 현재 활용률
  • 마지막으로 재부팅한 날짜 및 시간
  • LVM의 활성 여부
  • 활성 연결 수 
  • 서버를 사용하는 사용자 수
  • 서버의 IPv4 주소와 MAC주소
  • sudo 프로그램으로 실행된 명령의 수
#!/bin/bash
architecture=$(uname -a)
physicalcpu=$(grep "physical id" /proc/cpuinfo | sort | uniq | wc -l)
virtualcpu=$(grep "^processor" /proc/cpuinfo | wc -l)
freemem=$(free -m | awk '$1 == "Mem:" {print $2}')
usedmem=$(free -m | awk '$1 == "Mem:" {print $3}')
pmem=$(free | awk '$1 == "Mem:" {printf("%.2f"), $3/$2*100}')
freedisk=$(df -Bg | grep '^/dev/' | grep -v '/boot$' | awk '{ft += $2} END {print ft}')
useddisk=$(df -Bm | grep '^/dev/' | grep -v '/boot$' | awk '{ut += $3} END {print ut}')
pdisk=$(df -Bm | grep '^/dev/' | grep -v '/boot$' | awk '{ut += $3} {ft+= $2} END {printf("%d"), ut/ft*100}')
cpuload=$(mpstat | grep all | awk '{printf "%.2f%%\n", 100-$13}')
lastboot=$(who -b | awk '$1 == "system" {print $3 " " $4}')
lvmtotal=$(lsblk | grep "lvm" | wc -l)
lvmused=$(if [ $lvmtotal -eq 0 ]; then echo no; else echo yes; fi)
conexionstcp=$(ss | grep -i tcp | wc -l | tr -d '\n')
userlog=$(users | wc -w)
ip=$(hostname -I)
mac=$(ip link show | awk '$1 == "link/ether" {print $2}' | sed '2, $d' | tr -d '\n'
printf "\n")
numberofcommands=$(journalctl _COMM=sudo | grep COMMAND | wc -l)
wall "	#Architecture: $architecture
	#CPU physical: $physicalcpu
	#vCPU: $virtualcpu
	#Memory Usage: $usedmem/${freemem}MB ($pmem%)
	#Disk Usage: $useddisk/${freedisk}Gb ($pdisk%)
	#CPU load: $cpuload
	#Last boot: $lastboot
	#LVM use: $lvmused
	#Connections TCP: $conexionstcp ESTABLISHED
	#User log: $userlog
	#Network: IP $ip ($mac)
	#Sudo: $numberofcommands cmd"
  • uname : 시스템 정보 출력 명령어
    • -a : 커널 이름, 네트워크 호스트명, 커널 릴리즈 정보, 커널 버전, 시스템의 하드웨어 타입, 운영체제 이름 출력
  • /proc/cpuinfo : cpu 정보가 담겨있는 파일
    • uniq : 중복된 명령을 제거
  • free : 시스템 메모리 사용 현황 출력
    • -m : MB 단위로 표시
  • df : 파일 시스템 디스크 공간의 사용량을 출력
    • -BM : 크기를 1Mb 단위로 용량을 표시
    • -Bg : 크기를 1Gb 단위로 용량을 표시
  • mpstat : 사용 가능한 cpu와 core별 사용량을 출력
  • who : 호스트에 로그인한 사용자 정보 출력
    • -b : 마지막 시스템 부팅 시간 출력
  • ss : 소켓 상태를 조회할 수 있는 유틸리티
  • hostname : 시스템 이름을 확인하고 설정
    • -I : 호스트의 ip주소를 출력
  • ip : 인터페이스를 위, 아래로 가져오고, 주소와 경로를 할당 및 제거, arp 캐시 관리 등 다양한 용도로 사용
    • link : 네트워크 인터페이스를 표시하고 수정
    • show : 관련 인터페이스 출력
  • journalctl : systemd의 서비스 로그 확인
    • systemd : 사용자 공간을 부트스트래핑하고 최종적으로 모든 프로세스들을 관리하는 init 시스템
    • _COMM=sudo : 특정로그 보기

 

Cron

cron이란? 

작업 예약 스케줄러

 

cron 기본 문법

분 시 일 월 요일 실행할작업

기본적으로 *으로 표기

요일의 경우 토요일은 6, 일요일은 0 사용

주기를 입력할 때는 / 사용 (ex) */10 * * * * : 10분 마다)

구간을 입력할 때는 - 사용 (ex) 1-3 : 1부터 3)

여러 시간을 동시에 입력할 때는 , 사용

 

cron 설정

#crontab 이동
crontab -e

#아래 내용 입력
* / 10 * * * * /root/쉘스크립트 파일 | wall
  • crontab : 특정 파일을 주기적으로 실행 시킬 수 있는 프로그램
    • -e : 예약 파일을 편집할 수 있게하는 명령어
  • wall : 모든 터미널에 메세지를 출력

'42 Seoul' 카테고리의 다른 글

[42 Seoul] get_next_line  (0) 2022.09.22
[42 Seoul] Born2beroot - Bonus  (0) 2022.09.06
[42 Seoul] Born2beroot - User, Hostname, Partitions  (0) 2022.09.05
[42 Seoul] Born2beroot - 프로젝트 개요  (0) 2022.09.01
[42 Seoul] ft_printf  (0) 2022.08.19
복사했습니다!