[42Seoul] Born to be root

jiyseo·2022년 8월 17일
0

42 Seoul

목록 보기
9/9

과제를 시작하기 전

  1. Virtual Machine

    하나의 물리 서버를 보다 효율적으로 사용하기 위해 사용

  • VM 동작 원리
  • 선택한 OS에 대한 설명, 이유
  • 가상머신의 목적
  • CentOS, Debian 차이
  • aptitude, apt 차이
  • AppArmor이란

defense 준비

https://dc-choi.tistory.com/55

Project overview

  • VM 동작 원리
    • 물리적으로 1대인 컴퓨터에서 마치 여러 대의 컴퓨터로 운영하는 것과 같은 환경을 제공해주는 소프트웨어

    • 고로, 각 운영체제 환경은 격리상태에서 동일한 하드웨어에서 병렬실행 가능함 (자원의 낭비를 줄인다.)

  • 선택한 OS에 대한 설명, 이유
  • 가상머신의 목적
    • 컴퓨터의 다른 부분에 영향을 주지 않는 독립 환경을 만들고 싶을 때 예를 들어, 악성 코드를 분석 할 때 감염을 방지하기 위해 사용한다.
  • CentOS, Debian 차이
    • CentOS = 기업용으로 주로 사용하며 RHEL(Red Hat Enterprise Linux)을 그대로 가져옴. 간단히 말해 Redhat 체험판으로 보면 됨. 다만 업데이트가 느리고 개인이 다루기 어려움.

    • Debian = 개인용으로 CentOS보다 사용하기 쉬움. Debian 계열로는 Ubuntu, Kali 등이 있음. 문제 요구사항에서 초보자일 경우 데비안을 선택할 것을 추천.

      Redhat 계열로 CentOS 외에 Fedora, Oracle 등이 있음.

  • aptitude, apt 차이
    • 셋 다 소프트웨어 설치 및 제거를 정상적으로 처리하는 무료 오픈소스 소프트웨어 dpkg: 패키지 관리자 원형 apt-get: 의존성 관리가 되는 패키지 관리자 apt: apt는 apt-get의 기능을 간소화 aptitude: 패키지 설치 혹은 삭제 중 충돌될 경우 마땅한 조치를 제안함, 사용하지 않는 패키지를 자동으로 제거함, apt-get이나 apt보다 상위 수준의 패키지 관리자이다.
    • apt = apt(advanced packaging tool)는 데비안 사용에 필요한 각종 소프트웨어 프로그램을 설치하기 위해 필요한 cli용 패키지 관리 툴이다. 무료 오픈 소스이면서 low level이지만 자유도가 높다.프로그램 충돌이 발생할 경우 충돌 패키지 자동 제거는 -auto-remove 등의 추가 옵션이 필요하다. 또한 apt는 다른 고수준 패키지 매니저에 의해 사용될 수 있다.
    • aptitude = apt보다 기능이 더 많고, 편리한 high level 패키지 매니저이다. 사용자 인터페이스를 추가해 대화형으로 패키지를 검색하고 설치 및 제거를 할 수 있다. 사용하지 않는 패키지를 자동적으로 제거해주거나 설치,제거,업데이트 과정에서 충돌이 있을 경우엔 다른 대안도 함께 제시해준다.
  • AppArmor이란
    • AppArmor(Application Armor)는 시스템 관리자가 프로그램 프로필 별로 프로그램 보안을 세팅할 수 있게 해주는 리눅스 커널 보안 모듈이다.

    • Mandatory Access Control(MAC)로 관리자가 특정 프로그램에 대한 네트워크, 소켓, 입출력 등에 대한 접근을 제한할 수 있게 한다.

    • 앱아머 프로필은 /etc/apparmor.d 디렉토리에 저장된다.두가지 모드가 있다.

    • Enforce mode – 로그를 남김과 동시에 제한을 강제한다.

    • Complain mode – 제한은 안 하지만 로그를 남긴다.

    • AppArmor 실행확인

      $ sudo apparmor_status //앱아머 상태보기(또는 $sudo aa-status)
      $ sudo aa-enabled //활성화 여부 확인

Simple setup

  • 그래픽 환경이 아닌지 확인
  • 사용자(user)에 연결 - 포트포워딩이 아니라 자기꺼로 들어가는 것
  • UFW 서비스 시작되었는지 확인 sudo ufw status verbose
  • SSH 서비스가 시작되었는지 확인 systemctl status ssh
  • 사용되는 OS가 Debian 인지 CentOS 인지 확인 hostnamectl

User

  • 현재 사용자의 group status 확인 : id [사용자명]

  • 현재 password 정책 설명 : sudo vi /etc/login.defs

    • PASS_MAX_DAYS 30 : password는 30일 마다 만료되어야 함
    • PASS_MIN_DAYS 2 : 비밀번호는 최소 2일을 사용해야 함. 즉, 2일 이후에 비밀 번호 변경 가능
    • PASS_WARN_AGE 7 : 유저는 비밀번호가 만료되기 7일 전부터 경고 메세지를 받아야 함

패스워드 정책을 설정하기 위해 패스워드 만료 모듈 설치

sudo apt install libpam-pwquality

설정하고 싶은 패스워드 정책 추가

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

  • retry=3 : 암호 입력 3회 까지
  • minlen=10 : 암호 최소 길이 10
  • difok=7 : 기존 암호와 달라야 하는 문자수 7
  • ucredit=-1 : 대문자 1개 이상
  • lcredit=-1 : 소문자 1개 이상
  • dcredit=-1 : 숫자 1개 이상
  • maxrepeat=3 : 최대 3글자까지 중복된 문자 연속 사용 가능
  • reject_username : username이 그대로 또는 뒤집혀서 패스워드에 들어있는지 검사, 들어있으면 거부
  • enforce_for_root : 해당 비밀번호 정책을 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
  • 새로운 그룹 생성 (그룹명 : evaluating)
  • $adduser USERNAME : home dir 자동생성

$ cat /etc/group : 그룹 조회

$ groupadd [그룹명] : 그룹 추가

$ groupdel [그룹명] : 그룹 삭제

$ groupmod -n [그룹명][새 그룹명] : 그룹명 수정

$ usermod -aG [그룹명,그룹명, ... ][사용자명] : 사용자를 그룹에 추가

$ usermod -g [그룹명][사용자명] : primary group 설정

$ id [사용자명] : 사용자의 gruop 확인

  • password 정책의 장점
  • password 정책을 이행하는 것의 단점장점 : 보안향상단점 : 지나치게 복잡할 경우 메모리 위험, 일부 특수문자 키보드 호환 안 될 가능성

Hostname and partitions

  • hostname 확인 hostnamectl

  • hostname 변경 sudo hostnamectl set-hostname [새로운 호스트명]변경 후 restart
  • 파티셔닝 상태 확인 lsblk
  • LVM 무엇인지, 어떻게 동작하는지 설명
  • 리눅스 안에서 하나의 디스크를 여러 파티션으로 분할해서 파일 시스템을 사용해 특정 디렉터리와 연결시켜 사용하게 됩니다. 이때 하드디스크를 파티션으로 나눌 경우 물리적인 개념이 강해서 고정적인 용량으로 사용하게 됩니다. 따라서 디스크의 추가/제거 시에 별도로 복잡한 작업이 필요하게 되고 데이터 관리가 불편할 수 있습니다.
  • LVM은 파티션을 논리적인 개념인 볼륨으로 나눠서 더 유동적으로 디스크의 용량을 관리할 수 있습니다.
  • Logical Volume을 효율적이고 유연하게 관리하기 위한 커널의 한 부분이자 프로그램이며, 물리적 스토리지 이상의 추상적 레이어를 생성하여 논리적 스토리지를 생성할 수 있게 해줌
  • 파티션 : 어떤 하나의 무언가를 여러개로 나누는 개념
  • LVM: 여러 디스크 공간, 짜투리 공간을 합쳐서 하나로 만든 것
  • 사용이유: 여러 디스크 공간을 합쳐서 하나인 양 사용하기 위해,
  • 유연한 용량 사용, 사용하기 애매한 공간의 디스크 파티션들을 활용하기 위해, 기존에 사용중인 디스크의 공간을 확장할 수 있기에

SUDO

  • sudo 설치 : apt install sudo

  • sudo 설치 여부 확인 dpkg -l sudo (dpkg : package manager for Debian)

  • 새로운 사용자 sudo 그룹에 추가 sudo usermod -aG sudo [새로운 사용자명]

  • sudo에 대한 엄격한 규칙, sudo 사용하는 가치, 사용하는 이유, 작동 원리

    • sudo는 유닉스 및 유닉스 계열 운영 체제에서, 다른 사용자의 보안 권한, 보통 슈퍼유저로서 프로그램을 구동할 수 있도록 하는 프로그램이다. root가 아닌 사용자가 root에 준하는 능력으로 실행할 수 있게 하는 명령어이며, 사용을 허락한 사용자는 모두 사용할 수 있다. 관리자 권한을 가지지만 근본적으로는 해당 사용자가 내리는 명령이다.
    • 사용 이유
      • log 추적이 쉬워진다. root는 무슨 작업을 했는지 일일이 확인하는게 불가능하지만 sudo를 사용하면 command 단위의 logging이 가능해서 정확한 기록을 확인할 수 있음
      • 관리의 권한과 책임이 명확해진다. root 권한을 여러 사람이 공유할 때 어떤 작업이 누구에 의해 행해졌는지 불분명해진다. sudo를 사용하면 명확해짐
      • 침입자는 sudoers에 등록되어있지 않기 때문에 시스템을 조작하기 위해서는 root로 가서 sudoers에 자신을 등록해야함. 등록할 시 존재가 노출되기 때문에 침입탐지의 기능을 함
    • 직접 /etc/sudoers 파일을 편집하다가 실수가 발생하면, sudo를 사용할 수 없게 된다. visudo는 문법체크를 해준다.
  • /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에서만 실행 가능

    • TTY : teletypewrite, 콘솔의 한 종류로 os에서 제공하는 가상 콘솔. 실제 물리적인 장치가 연결된 것이 아닌 커널에서 터미널을 에뮬레이팅하는 것이다.
  • iolog_dir="/var/log/sudo/" : sudo log 저장 디렉토를 지정

  • passwd_tries=3 : sudo 비밀번호 인증 횟수 지정 (기본값은 3)

log의 경우 /var/log/sudo/00/00에서 확인할 수 있으며 sudo 명령어 하나마다 하나의 폴더가 생성된다.

폴더에는 총 7개의 log 파일이 존재한다.

log

  • sudo 실행 시 실행한 위치와 실행한 명령어의 위치가 저장되어 있다.

stderr

  • sudo로 실행한 명령어가 오류로 인해 실행되지 않았을 시 출력되는 내용이 저장되어 있다.

stdin

  • sudo로 실행한 명령어가 표준 입력을 받은 내용이 저장되어 있다.

stdout

  • sudo로 실행한 명령어가 표준 출력으로 결과를 출력한 내용이 저장되어 있다.

timing

  • session timing file.

ttyin

  • sudo로 실행한 명령어가 tty로 입력받은 내용이 저장되어 있다.

ttyout

  • sudo로 실행한 명령어가 tty로 출력한 결과가 저장되어 있다.

UFW

  • UFW 설치 여부, 동작 여부 확인 sudo ufw status verbose
  • Firewall (방화벽)
    • 보안이 필요한 네트워크의 통로를 단일화하여 관리함으로써 외부의 불법침입으로부터 내부의 정보자산을 보호하기 위한 시스템
    • 사용자 인증, 주소변환, 감사기록 등이 장점, 바이러스와 같은 맬웨어 형태로 존재하는 위협은 방어할 수 없다
  • UFW 설명, 사용가치
    • UFW(Uncomplicated Firewall)은 데비안 계열을 비롯한 다양한 리눅스 환경에서 작동되는, 사용하기 쉬운 방화벽 관리 프로그램이다. 방화벽은 데이터 패킷을 분석하고, 적용된 규칙에 따라 허용여부를 결정해 들어오고 나가는 네트워크 트래픽을 제어하는 네트워크 보안 시스템이다.
    • 사용자가 직접 방화벽을 설정하는 것은 매우 복잡하다. UFW는 사용자가 사용하기 쉬운 CLI를 사용하고 프로그램 구성에 iptables를 사용하여 netfilter 방화벽을 관리한다. 즉, 사용자 친화적이고 사용하기 쉬운 인터페이스를 제공하는 방화벽을 관리 프로그램이 바로 UFW이다.
    • ufw를 기본으로 사용하면 네트워크 방화벽이라기 보다는 호스트 방화벽이라고 보는 편이 더 낫다. 즉,명령을 실행하는 서버가 목적지로 자동 할당되기 때문이다. 해당 서버에 SSH 서비스를 실행중이고 SSH를 이용한 원격접속을 허용한다면 다음과 같이 입력한다.
  • IPv6 켜져있는지 확인 sudo nano /etc/default/ufw
  • 현재 rules 확인 sudo ufw status numbered

  • 새로운 rule 추가 sudo ufw allow 8080
  • sudo vi /etc/ssh/sshd_config Port 8080
  • rule 삭제 sudo ufw delete allow 8080

SSH

  • SSH 설명, 사용가치
  • 원격 호스트에 접속하기 위해 사용되는 보안 프로토콜
    • SSH(Secure Shell)는 원격으로 public network를 통해 호스트 컴퓨터와 통신을 할 때 보안을 위해 사용되는 프로토콜이다. 기존의 텔넷(telnet)이 취약했기에 암호화 기능을 추가한 보안 프로토콜이다. 개인키-공개키 쌍의 비대칭키 방식을 사용한다. 쉘로 원격 접속하기 때문에 기본적으로 CLI로 실행하며 기본 포트는 22번이다.
    • Secure Shell Protocol의 약자로, 네트워크 프로토콜 중 하나로 컴퓨터와 컴퓨터가 인터넷과 같은 Public Network를 통해 서로 통신을 할 때 보안적으로 안전하게 통신하기 위해 사용하는 프로토콜이다.
    • ssh는 공개키방식의 암호화를 사용한다. public key를 통해 메세지를 전송하기 전 암호화를 하게 됨. 복호화는 불가, 절대로 외부에 노출되어서는 안되는 private key로 본인의 컴퓨터 내부에 저장되어 있고 이를 통해 복호화함
  • ssh 서버 설치 확인apt search openssh-server
  • ssh 서버 설치 apt install openssh-server
  • ssh 서버 실행 중인지 여부 확인 systemctl status ssh

  • vi /etc/ssh/sshd_config `#Port 22 --- 제거
    port 4242 --- 추가 PermitRootLogin no --- no로 변경`
    • 공격자가 임의의 주소에 root 계정으로 접속이 가능한지 여부를 무한 스캐닝을 통해 알아 낼 수 있다. 따라서 위와 같이 root 계정의 접근을 막고 일반 유저로 접속한 다음 root 계정을 불러오는 것이 좋다.
  • ss -tunpl 명령어로 정보 확인
  • 새로운 사용자로 terminal 에서 접근host IP, guest IP 비움ssh 연결 방법 : ssh jiyseo@127.0.0.1 -p 4242 로 연결 (포트포워딩)vi
  • ip 확인방법 ip addr show / ip address

https://nostressdev.tistory.com/3

Script monitioring

  • cron 특정한 시간에 or 특정 시간마다 어떤 작업을 자동으로 수행하게 하는 명령
  • crontab cron작업을 설정하는 파일 cron프로세스는 /etc/crontab 파일에 설정된 것을 읽어 작업을 수행

분 시 일 월 요일 명령

  • /usr/sbin/anacron 크론과 같이 동작하는 프로그램으로 서버가 일정시간 중지되었을 때에도 작업이 실행되는 것을 보장하기 위해 사용하는 도구
  • /etc/cron.daily /etc/cron.weekly /etc/cron.monthly 시스템 크론 설정 디렉토리, cron은 주기적으로 실행할 내용을 시스템 크론 설정 디렉토리에 넣어 작동시킴.
  • /var/log/cron 크론 실행내용이 기록
  • /10 * * * * /monitoring.sh | wall
  • 어떻게 스크립트를 설정했기에 10분마다 한 번씩 실행되는지
$ 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

monitoring.sh 작성

                                                                                          
#!/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";
profile
코딩뿡뿡이

0개의 댓글