Born2beRoot

김지수·2023년 6월 23일
0

42

목록 보기
3/4

과제 해석

해당 프로젝트의 목적은 내가 나만의 os를 규칙을 설정해 설치할 수 있게 하는 것이다.
signature.txt 파일만 저장소에 저장해야 한다. 내 컴퓨터의 가상 디스크 서명을 붙여야만 한다.(이게 무슨 말인가?)
이 프로젝트는 특정 규칙에 따라 나의 첫번째 서버를 만드는 것이다.
(서버를 설치하는 것이 문제이므로, GUI와 관련된 것은 설치하지 말아야한다.)

debian 최신 버전을 선택해야 하며 AppArmor와 SELinux가 시작 시 자동으로 실행되도록 설정되어야 한다. 최소한 2개의 암호화된 파티션을 LVM을 사용하여 생성해야 한다.
os관련 지식 몇 가지를 알아야 디펜스 할 수 있다.

SSH service는 오직 4242포트를 통해서만 작동한다. 보안상의 이유로 root 계정으로 SSH에 접근하는 것은 불가하다. SSH 작동 방식에 대해 알고 있어야 한다.
운영 체제를 UFW 방화벽으로 구성하여 포트 4242만 열어두도록 설정해야 한다. 방화벽은 VM을 설치할 때 활성화되어 있어야 한다.

VM의 hostname은 jisukim42이다. 평가를 진행하며 hostname을 바꾸게 될 것이다. 강력한 암호 정책을 구현해야 한다. 엄격한 규칙에 따라 sudo를 설치하고 구성해야한다. root 사용자 뿐만아니라 로그인 이름을 사용자 이름으로 하는 사용자가 존재해야 한다. 해당 사용자는 user42와 sudo group에 속해야 한다. 디펜스 동안 새로운 유저를 만들고 이를 그룹에 넣어야 한다.


강력한 암호 정책을 구현하기 위해, 다음의 규칙을 따라야 한다.

  • 비밀번호는 30일 마다 만료된다.
  • 암호를 수정하기 위해 허용되는 최소의 날은 2일이다.
  • 사용자는 비밀 번호가 만료되기 7일전에 warning message를 받아야 한다.
  • 비밀번호는 최소 10글자여야 한다. 그리고 대, 소문자 숫자가 반드시 포함되어야한다. 또한 동일한 문자가 3번 반복 되어선 안된다.
  • 비밀번호가 유저의 이름을 포함해선 안된다.
  • 해당 규제는 root 비밀번호에 적용하지 않는다: 해당 비밀 번호는 이전 비밀번호의 부분이 아닌 최소 7자를 가져야 한다.
  • 물론 나의 root 비밀번호는 이 규칙에 적용을 받는다.
  • 파일을 구성한 후, root 계정을 포함해 VM의 모든 계정의 비밀번호를 변경해야한다.

sudo 그룹에 대한 강력한 구성 설정을 위해 다음의 조건을 따라야 한다.
  • sudo 권한을 사용하여 인증 시, 잘못된 암호로 인한 오류가 3번으로 제한 된다.
  • sudo를 사용할 때 틀린 비밀 번호로 인해 에러가 발생하면, 사용자 정의 메시지가 출력되어야한다.
  • sudo를 사용한 모든 작업은 입, 출력 모두 기록되어야 한다. 저장 위치 파일은 /var/log/sudo입니다.
  • 보안을 이유로 TTY 모드가 활성화 되어야 한다.
  • 보안상의 이유로 sudo에 의해 사용할 수 있는 경로는 제한적 이여야 한다.(/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin)

monitoring.sh라 불리는 간단한 스크립트를 bash를 활용하여 만들어야 한다. 서버가 시작된 후 아래 나열환 정보들을 10분마다 출력해야 한다.(wall을 참조) 베너는 선택사항이다. 에러는 표시되면 안된다.


스크립트는 항상 다음 정보를 나타낼 수 있어야한다.

  • os체제 아키텍처와 커널 버전
  • 물리 프로세서 수
  • 가상 프로세서 수
  • 서버에서 현재 이용가능한 RAM과 이용률(%로 표시)
  • 메모리에서 현재 이용가능한 RAM과 이용률(%로 표시)
  • 프로세스의 현재 이용률(%로 표시)
  • 마지막 재부팅 날짜와 시간
  • LVM이 활성화 되어있는지 안되어 있는지
  • 활성화된 연결 수
  • 서버를 이용하는 유저의 수
  • 서버의 IPv4주소와 MAC주소
  • sudo 프로그램으로 실행된 명령의 수

디펜스하는 동안, 이 스크립트가 어떻게 작동하는지 설명하여야 한다. 또한 수정하지 않고 이를 중단해야한다. con에 대해 살펴보아야 한다.


디펜스 준비

피평가자는 평가자에게 모든 도움을 줄 수 있어야 한다. 즉, 원하는 정보를 바로바로 보여줄 수 있어야 한다.

프로젝트 개요

1. 가상머신은 어떻게 동작하는가
가상 머신은 물리적 하드웨어 시스템에 구축되어 자체 cpu, 메모리, 네트워크 인터페이스 및 스토리지를 갖추고 가상 컴퓨터 시스템으로 작동하는 가상환경이다. 하이퍼바이저라 불리는 소프트웨어는 하드웨어에서 가상 머신의 리소스를 분할하고 적절히 프로비저닝하여 VM에서 사용할 수 있도록 한다.
여기서 하이퍼바이저란 호스트 컴퓨터에서 다수의 운영체제를 동시에 실행하기 위한 논리적 플랫폼을 말한다. 가상화 머신 모니터 또는 가상화 메신저(VMM)라고 부른다. 하이퍼바이저는 2가지 타입으로 분리된다.
타입 1은 운영체제가 프로그램을 제어하듯이 하이퍼바이저가 해당 하드웨에서 직접 실행되며 게스트 운영체제는 하드웨어 위에서 2번째 수준으로 실행된다.
타입 2는 일반 프로그램과 같이 호스트 운영체제에서 실행되며 VM 내부에서 동작되는 게스트 운영체제는 하드웨에서 3번째 수준으로 실행된다. 버추얼 박스가 이에 해당한다.

2. 어떤 운영시스템을 선택했는가
Debian
1993년 최초 출시
커뮤니티에서 만들고 배포했기에 사후지원과 배포가 늦은편
오픈소스 구성요소같은 운영체제
Linux를 커널(운영체제에서 자원을 관리해주는 핵심부분)로 사용함
패키지 설치 및 업그레이드가 단순하고 다양한 패키지를 가지고 있음
DEB패키지 형식 (dpkg와 APT를 프로그램의 설치,제거,업그레이드 구성을 관리하는 패키지 관리자로 사용)

3. rocky와 Debian의 간단한 차이점들(비교)
CentOS
RedHat에서 공개한 리눅스 유료 배포판인 RHEL의 로고를 바꿔 2004년 출시되었음
RHEL처럼 기술지원등의 서비스는 받을 수 없음
다양한 아키텍처를 지원하진않음
RPM패키지 형식 (YUM과 DNF를 프로그램의 설치,제거,업그레이드 구성을 관리하는 패키지 관리자로 사용)
Rocky는 이러한 환경을 그대로 가져온 것으로 엔터프라이즈 환경에서의 안정성과 호환성을 강조함

Debian
안정성과 보안에 중점을 둔 릴리즈 정책을 사용, 자체 개발된 패키지 관리 시스템인 APT를 사용, 커뮤니티 기반의 개발을 중심으로 진행

4. 가상머신의 목적
1. 하나의 컴퓨터로 서로 다른 두 개 이상의 운영체제를 실행하고자 할 때
2. 하나의 컴퓨터 자원을 여러 사용자에게 나누어 주는 상황에서 상호 간섭을 없애고 싶을 때
3. 컴퓨터의 다른 부분에 영향을 주지 않는 독립 환경을 만들고 싶을 때

5. CentOS의 SeLinux와 DNF는 무엇인가
SeLinux란 관리자가 시스템 액세스 권한을 효과적으로 제어할 수 있게하는 Linux 시스템용 보안 아키텍처
(시스템의 애플리케이션, 프로세스, 파일에 대한 액세스 제어를 정의함, 이를 SELinux에 지정하는 룰 세트인 보안 정책을 사용하여 정책에서 허용되는 액세를 적용)
DNF는 RPM 기반 리눅스 배포판을 위한 패키지 관리도구
Yum의 낮은 성능, 많은 메모리 사용량, 비효율적인 중복 의존성 해결 매커니즘 등의 문제를 해결하기 위해 개발, 외부 라이브러리인 libsolv를 통해 의존성 문제를 처리

6. Debian의 aptitude와 apt 사이의 차이점, AppArmor란 무언인가, 스크립트가 10분마다 출력되고 있어야 함
aptitude는 사용자 인터페이스를 추가해 사용자가 대화형으로 패키지를 검색해 설치, 제거할 수 있는 higjh-level 패키지 관리 도구다. 데비안을 위해 만들어졌지만 rpm기반 패키지까지 확장된다.
텍스트 기반 대화형 인터페이스와 비대화형 command line 모드에서도 작동한다.
apt는 소프트웨어의 설치와 제거를 처리하는 패키지 관리 툴이다. 초기에는 .deb 패키지를 관리하기 위해 만들었지만 현재는 rpm패키지 매니저와도 호환된다. apt는 그래픽 인터페이스 없이 명령어로 사용한다. 설치할 패키지 명을 입력하면, '/etc/apt/sources/list'에 지정된 소스 목록에서 해당 패키지 + 종속성 목록과 함께 찾아 자동으로 설치한다. 즉 종속성에 대한 문제를 신경쓰지 않아도 된다. 굉장히 유연해서 사용자가 직접 새로운 소스 목록을 추가하거나 시스템이 업그레이드 되도 해당 패키지를 업데이트 하지 않게 해 현재 버전을 계속 사용하는 등의 작업을 할 수 있다.

같은 패키지 관리 도구인데 차이점은 다음과 같다.
aptitude가 더 방대하고 apt-get, apt-cache를 포함한 기능들을 포함한다.
apt-get이 패키지 설치, 업그레이드, 종속성 검사 등을 한다면, aptitude는 이보다 많은 일을 할 수 있다.
특정 패키지를 삭제할 때, aptitude는 사용되지 않는 패키지까지 삭제한다. 반면 apt는 사용자가 '-auto-remove', 'apt-get autoremove'를 명시해줘야 한다.
apt는 설치, 제거 중 충돌이 일어나면 종료되지만 aptitude는 해결 방법을 제시할 수 있다.

AppArmor는 시스템 관리자가 프로그램 프로필 별로 프로그램의 역량을 제한할 수 있게 해주는 리눅스 커널 보안 모듈이다. 프로필들은 네트워크 액세스, raw 소켓 액세스 그리고 파일의 읽기, 쓰기, 실행 같은 능력을 허용할 수 있다. 강제적 접근 통제(MAC)를 제공함으로써 전통적인 유닉스 임의적 접근 통제(DAC) 모델을 보완한다.
DAC(임의적 접근 통제)
시스템 객체에 대한 접근을 사용자나 그룹의 신분을 기준으로 제한
사용자나 그룹이 객체의 소유자라면 다른 주체에 대해 해당 객체에 대한 접근 권한 설정 가능
자신의 판단에 의해 권한을 줄 수 있기 때문에 임의적이라고 함
MAC(강제적 접근 통제)
미리 정해진 정책과 보안 등급에 의거하여 접근 통제
자원에 대한 접근은 주체의 보안등급과 객체의 보안레벨에 기반
관리자만이 객체의 보안레벨, 주체의 보안등급을 수정할 수 있음
높은 보안을 요구하는 정보는 낮은 보안 수준의 주체가 접근할 수 없음
객체의 소유자라고 해도 정책에 어긋나면 객체에 접근할 수 없음

기본 설정

1. 해당환경이 그래픽 환경인가

echo $XDG_SESSION_TYPE

x11, wayland가 나오면 GUI의미
tty가 나오면 CLI의미

2. 사용자에게 연결하는 방법(포트포워딩이 아닌 자기의 것으로 들어가야 함, 사용자는 root가 아니여야 함, 비밀번호 규칙을 따르는지 확인)
포트포워딩이 아님으로 본인의 아이디를 입력해야 한다.

login:
Password:

자신의 계정으로 전환

3. UFW 서비스가 시작되었는지 확인

systemctl status ufw

결과에서 Active:active(running)을 확인하면 된다.
만약에 비활성화 되어있다면

sudo ufw enable

입력한다.

sudo ufw disable

은 ufw를 비활성화하는 명령어이다.

4. SSH 서비스가 시작되었는지 확인

systemctl status ssh

결과에서 Active:active(running)을 확인하면 된다.
만약에 비활성화 되어있다면

sudo systemctl enable ssh
sudo systemctl start ssh

입력한다.

sudo systemctl stop ssh
sudo systemctl disable ssh

는 ssh를 비활성화 하는 명령어이다.

5. 사용되는 OS가 Debian인지 CentOS인지 확인

cat /etc/os-release

입력하면 확인할 수 있다.

사용자

1. 현재 로그인한 유저가 sudo와 user42에 속해 있는지 확인

groups

를 통해서 현재 로그인한 유저가 속한 그룹을 알 수 있다.

groups john | grep developers

특정 그룹에 속해있는지 확인하기 위한 예시이다.

2. 비밀번호 정책에 관해 제시된 규칙이 있는데 이를 다음 절차를 통해 확인
(새로운 유저 생성, 임의로 비밀번호 만듦, 그 후 어떻게 규칙을 설정했는지 설명(보통 1개 혹은 2개의 수정 파일이 있어야 함))

sudo adduser [사용자 이름]

유저를 추가하는 방법이다.

비밀번호 규칙은

su -
vi /etc/login.defs

를 통해서 확인 가능하다.

3. 새로운 유저가 추가된 상태에서 피평가자가 "evaluating"이라는 그룹을 생성하도록 설정, 그 후 그 그룹을 이 유저에게 할당하도록 함. 최종적으로 "evaluating"그룹에 속하게 되었는지 확인

sudo groupadd [그룹 이름]

그룹을 만드는 방법이다.

sudo usermod -aG [그룹 이름] [사용자 이름]

사용자를 그룹에 속하게하는 방법이다.

grep [그룹 이름] /etc/group | cut -d: -f4

그룹에 속한 유저를 구하는 방법이다.

유저와 그룹을 삭제하는 방법

sudo deluser [사용자 이름]

하지만 위의 방식으론 홈 디렉토리와 메일박스가 삭제되지 않는다.

sudo deluser --remove-home [사용자 이름]

를 통해서 함께 삭제할 수 있다.

sudo deluser [사용자 이름] [그룹 이름]

를 통해서 그룹에서 사용자를 제거할 수 있다.
그룹을 삭제하기 전에 해당하는 모든 유저를 삭제한 후 진행해야 한다.
그 후

sudo groupdel [그룹 이름]

를 이용하여 그룹을 삭제한다.

4. 비밀번호 정책의 장점과 단점 설명
장점 보안성이 높다
단점 굉장히 귀찮다.

호스트명과 파티션들

1. 호스트명이 다음의 주어진 형식을 만족하는지 확인:login42

hostname

치면 확인 가능하다.

2. 평가자의 로그인으로 대체해서 원래의 호스트명을 수정, 다시 시작 후 호스트명이 업데이트 되어있지 않다면 평가 중단

su -
sudo nano /etc/hostname

에 들어가서 호스트명을 바꾼다.

3. 다시 원래의 호스트명으로 복원
위와 같은 방식으로 하면 된다.

4, 5. 어떻게 이 가상머신의 파티션들을 확인할 수 있는지 확인, 과제에 주어진 예시와 출력 결과물을 비교
방식이 3가지가 있다.

lsblk

로 그림과 똑같이 확인하는 방법이 있다.

sudo fdisk -l

모든 하드 디스크와 파티션에 대한 정보가 출력된다. 하드 디스크와 파티션의 크기, 파일 시스템 유형 등등의 정보를 확인할 수 있다.

df -h

단순히 디스크의 용량 정보만 간단히 확인할 수 있다.

SUDO

1. "sudo" 프로그램이 가상머신에 제대로 설치되어 있는지 확인

sudo --version

을 하면 확인이 된다.

2. 피평가자가 평가자의 새로운 유저를 "sudo" 그룹에 할당하는 것 보여줌
해당 문제는 위와 같다.

su -
sudo usermod -aG sudo [사용자 이름]

로 하면 된다.

3. 과제는 sudo에 대한 엄격한 규칙들을 강요함, 즉 sudo를 사용하는 이유와 그 동작을 보여줘야 함, 이후 과제에서 요구한 규칙에 대한 구현을 보여줘야 함
과제에서 요구한 규칙은

visudo

를 통해서 구현했음을 확인할 수 있다.

sudo란 리눅스와 유닉스 운영체제에서 슈퍼유저 권한으로 명령어를 실행할 수 있게 해주는 프로그램이다. 슈퍼유저 권한은 시스템에서 최상위 권한을 가지는 계정으로 모든 시스템 설정을 변경할 수 있다. 일반 유저는 이를 이용해 시스템에 패키지를 설치하는 등 자신의 권한을 넘어서는 활동이 가능하다.

동작 방식은 먼저 '/etc/sudoers' 파일을 참조하여, 해당 사용자가 슈퍼유저 권한으로 실행할 수 있는지를 확인하고 그 후 사용자는 비밀번호를 입력해 슈퍼 유저의 권한으로 실행한다.

sudoreplay /var/log/sudo/00/00/01

을 입력하면 다시 같은 명령어가 실행된다.

4. "/var/log/sudo/"폴더가 존재하는지, 최소 한개의 파일을 갖는지 확인, 해당 파일 속에는 sudo와 함께 사용된 명령어들의 기록을 볼 수 있어야 함, 직접 sudo명령을 실행하고 "/var/log/sudo/"가 업데이트 되었는지 확인
sudo 명령어를 실행하게 되면 /sudo/00/00에 업데이트가 됨을 확인 할 수가 있다.

UFW

1. "UFW"프로그램이 제대로 설치되어있는지 확인

dpkg -l ufw

를 이용하면 설치되어있는지 확인이 가능하다.

2. 제대로 동작하는지 확인

sudo ufw status

를 이용하면 현재 동작하는지 확인이 가능하다.

3. UFW가 무엇이고 그의 가치가 무엇인지 설명
hfw는 Ubuntu 및 다른 Debian 계열의 리눅스 시스템에서 사용할 수 있는 간단한 방화벽 도구이다. 기본적으로 비활성화 되었지만, 사용자가 규칙을 추가하여 활성화 할 수 있다. 즉 사용자가 쉽게 방화벽 규칙을 설정하고 관리할 수 있도록 하는 인터페이스를 제공한다.
AppArmor와의 차이는 무엇일까?
먼저 둘 다 리눅스 시스템에서 보안을 강화하는데 사용되는 도구임은 동일하다. 하지만 각각의 도구는 서로 다른 기능을 가지고 있다.
AppArmor는 프로세ㅇ스의 동작을 제한하고, 악성코드 및 해킹의 시도로부터 시스템을 보호하는 Mandatory Access Control시스템이다. 이는 시스템에 설치된 애플리케이션의 동작을 모니터링하고, 사전에 정의된 규칙에 따라 액세스를 제한한다.
ufw는 방화벽 도구로, 사용하면 사용자는 시스템에 들어오거나 나가는 트래픽을 모니터링하고, 이를 필터링 할 수 있다.

4. 활성화된 규칙들을 나열, 4242 포트에 대한 규칙도 있어야만 함

sudo vim /etc/ssh/sshd_config

이를 통해서 규칙을 볼 수 있다.

5. 8080 포트를 열기 위한 새로운 규칙을 추가, 활성된 규칙의 목록에 추가되었는지 확인

ufw allow 8080
sudo ufw status

6. 그 새로운 규칙을 삭제

sudo ufw delete allow 8080

SSH

1. "SSH" 서비스가 가상머신에 제대로 설치되었는지 확인

dpkg -l | grep ssh

를 통해 설치 되었는지 확인이 가능하다.

2. 제대로 동작하는지 확인

sudo systemctl status ssh

르 통해 active상태를 확인할 수 있다.

3. SSH가 무엇이고 그의 가치가 무엇인지 설명
네트워크 프로토콜 중 하나로, 원격지 호스트와 안전하게 통신할 수 있도록 해주는 프로토콜이다. ssh를 사용하면 인터넷이나 로콜 네트워크와 같이 불안정한 환경에서도 데이터를 안전하게 전송할 수 있으며, 데이터의 기밀성과 무결성을 보장할 수도 있다.
기본적으로 TCP와 함께 사용되며, 22번 포트를 사용한다. 데이터 전송시에는 대칭키 암호화와 공개키 암호화를 함께 사용한다. 다만 아까 4242로 바꿨기 때문에 해당 포트로 자료가 넘어간다고 한다.

4. SSH 서비스가 4242포트만을 사용하는지 확인

sudo ss -ltnp | grep sshd

를 이용하면 현재 무슨 포트를 사용하는지 알 수 있다.

5. 새롭게 생성된 유저에 로그인하기 위해 SSH를 사용하는 것을 보여야함, 평가자는 key나 간단한 비밀번호를 사용할 수 있음, "root" 유저로 SSH를 사용할 수 없음을 확인
터미널에서

ssh jisukim@127.0.0.1 -p 4242

를 이용하면 된다.
root 유저로는 이용할 수 없지만 계정을 로그인한 후에 su -를 통하여 변경이 가능하다.

Script monitoring

1. 스크립트가 어떻게 작동하는지 코드 보여주기

vi /root/monitoring.h

를 이용하여 코드를 어떻게 짰는지를 보여준다.
그 후

crontab -e

를 이용하여 현재 출력하고 있는 시간과 어떤 sh파일인지를 보여준다.

2. "cron"이란 무엇인지 확인
유닉스 계열 컴퓨터 운영 체제의 시간 기반 잡 스케줄러이다. 셸 명령어들이 주어진 일정에 주기적으로 실행하도록 규정해놓은 crontab(cron table) 파일에 의해 구동된다. crontab 파일들은 잡 목록 및 cron 데몬 에 대한 다른 명령어들이 보관된 위치에 저장되어 있다.

3. 피평가자가 서버시작이후 어떻게 설정을 해서 10분마다 실행되는지 확인

crontab -e

를 이용하여 보여주면 된다.

4. 매분(1분)마다 수정되게 바꿈
10 -> 1로 바꾸면 된다.

5. cron을 중지시키기

systemctl disable cron // 이후 inactive상태로
systemctl stop cron // 현재 상태 종료

추가 궁금증

sudo, apt, dpkg의 차이점

'sudo'는 일반 사용자가 시스템 관리 작업을 수행하기 위해 슈퍼유저 권한을 얻을 수 있는 프로그램이다.
'apt'는 Debian계열 리눅스에서 패키지관리를 위한 명령어이다.
'dpkg'는 또한 패키지 설치 및 관리 도구이지만 'apt'는 'dpkg'의 의존성 문제를 보완하였다.

추가 지식

linux가 os인가??

정답은 아니다. 단순 kernel일 뿐, 이를 이용하여 운영체제를 만든 것이 Debian 등이다.

LVM

lsblk

logical volume manager의 약자이다.
lvm을 이용하여 type에 lvm이라 적혀있는 것의 SIZE를 수정 가능하다. os를 이용하는 와중에도 변경이 가능하다. 윈도우에서 만약 수정을 하고 싶다면 처음부터 다시 설정을 해줘야 한다.

rocky와 debian

https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg

를 보면 centOS가 끊어졌음을 알 수 있다.

이스터애그

apt-get moo
aptitude moo -vvvvv

등등 있다.

재시작

reboot

누르면 재시작한다.

진행하며 참고한 사이트

https://velog.io/@tak_4242/Born2beroot-peertopeer-evaluation
https://dc-choi.tistory.com/59
https://techdebt.tistory.com/18
https://velog.io/@joonpark/aptitude-vs-apt
https://velog.io/@jen133/Debian
https://inpages.tistory.com/86
https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg
profile
노는게 제일 좋아

0개의 댓글