문제 요약
클러스터의 mac 에 virtual box를 이용해 Debian을 설치하고,
(개인 맥북을 이용해 과제를 하는 것으로 변경)
M1 프로세서가 탑제된 맥북 에어 에선 Virtual Box 가 지원되지 않기에 UTM을 사용하여 Debian 을 설치하는 방법을 선택했다. (UTM이 가상 프로세서를 지원하기 때문에 클러스터와 똑같이 x86_64 프로세서 버전의 debian 을 설치할 수 있다.)
먼저 UTM과 Debian을 설치한다.
파티션 분리, 비밀번호 설정, 루트 디렉터리 설정, sudo 권한 설정, 네트워크 설정, ssh 설정, 등 요구사항을 수행하고,
가상머신의 상태 요약하여 보여주는 동작을 수행하는 쉘 스크립트(monitoring.sh)를 작성하고
crontab을 이용하여 해당 스크립트가 주기적으로 실행되도록 세팅한다.
마지막으로 가상머신의 스냅샷을 촬영하고, 스냅샷의 sha 형식의 암호문을 shasum 명령을 수행한 결과를
signature.txt 라는 파일에 담아 제출한다.
UTM 및 Debian 설치
사용 소프트웨어 정보
가상 머신: UTM 3.0.4
OS: debian-11.2.0-amd64-netinst
Debian 설치 전 UTM 세팅
UTM을 설치하는 것은 어렵지 않기 때문에 생략하겠다.
UTM을 실행하면 다음과 같은 화면을 볼 수 있다.
클러스터와 같은 x86_64 아키텍처용 Debian을 사용할 것 이므로 Emulate 을 선택한다.
Debian은 리눅스다. Linux 선택
다운 받은 amd64 iso 파일을 선택한다.
할당할 자원에 대한 정보이다. 아마 호스트 컴퓨터의 성능에 따라 다르게 나올 것으로 생각된다.
따로 건들지 않고 Next 를 눌렀다.
할당할 드라이브 저장공간 에 대한 정보를 입력한다.
클러스터에서 8GB를 할당하고 문제가 없었으므로 8GB를 할당하고 넘어가겠다. (사용할 공간이 별로 크지 않기 때문에 더 적어도 상관없을 것으로 생각된다.)
Next 를 눌러준다.
Open VM Settings 에 체크를 걸어준다. (체크 하면 바로 뒤에서 리눅스의 팽귄 이미지를 Debian의 빨간색 문양? 으로 변경할 수 있다. 다른 기능도 있으나 건들지 않았다.)
세련된 Debian 문양으로 이미지를 변경한다.
VM에서의 세팅은 이로써 끝났다. 재생 버튼을 눌러 Debian 을 설치하는 단계로 넘어가자
Debian 설치
드디어 Debian 의 Installer가 실행되었다.
Graphical install옵션 말고 그냥 install으로 진행하자. (결과에 차이는 없으나 왠지 Graphic은 거부감이 들었다.)
국가설정, 언어 설정이 나타난다. 어차피 영어만 사용할 예정이므로 빠르게 Enter를 눌러 넘어가자
과제 요구사항을 읽어보면 hostname에 대한 규칙이 있을 것이다.
도메인 이름은 입력하지 말고 넘어간다.
Root 의 비밀번호를 설정하라고 한다.
과제에 규칙이 나와있으니 그것을 따라서 비밀번호를 만들어 입력하자.
한 번 더 입력!
사용자 한명을 만들라고 한다. 마찬가지로 과제에 사용자 이름에 대한 요구사항이 있다. 맞추어 입력하자
사실 방금것은 사용자의 실명을 입력한 것이었고 지금 입력창이 그 사용자의 계정명(username)을 입력하는 창이다.
알아서 입력되어 있으니 Continue
방금 계정의 비밀번호를 작성해야 한다. 마찬가지로 과제 요구사항을 준수하여 비밀번호를 설정하자.
과제에서 encrypted LVM 저장공간을 만들라고 했다. 3번째를 선택하고 엔터를 누르자.
엔터.
과제에서 2개 이상의 LVM을 만들라고 했었고, lsblk 명령 예시를 참고하면 home 파티션이 root와 뚝 떨어져 있는 것을 확인 할 수 있다.
Yes
encrypted LVM 을 선택했으니 디스크 복호화 암호도 있어야 한다.
입력창 상단에 적힌 안내문을 준수하여 비밀번호를 설정하자.
이것 잊어버리면… 절대 안된다!
한 번 더 입력!
자신이 Debian 할당한 디스크 용량에서 조금 차감한 값이 자동으로 입력되어있을 것이다.
위와 같이 파티셔닝 하겠다고 한다. 엔터를 눌러 허가하자
중간에 스크린샷 남기는 것을 잊어버려 파티셔닝을 다시했어야 했는데 아래 창이 나타난 것은 아마 그 때문으로 생각된다. 정상적으로 잘 진행했다면 아마 안나타나지 않았을까??
아무튼 yes 해준다.
추가로 설치할 미디어파일이 없으므로 No를 선택한다.
American
(뭘 선택하든 상관없다.)
뭘 선택하든 상관없다.
공백으로 남기자.
ssh와 기본 유틸리티만 있으면 된다.
바로 엔터 눌러주자.
설문은 참여하지 않는다. No
이후 설치가 완료되었다는 메세지가 나타나고 엔터를 누르면 재부팅이 시작된다.
그런데 다시 설치화면으로 돌아와 있을 것이다.
Debian을 종료하고 아래 그림처럼 설치 iso를 clear 해준다.
과제 요구사항 세팅
로그인
돌발상황
첫 실행에선 나타나지 않고, 두 번째 실행부터 grub를 실행 안하고 얼타는 듯 하다.
만약 다음과 같은 화면을 마주했다고 해서 당황하지 말자.
침착하게 다음 명령어를 입력하면 해결된다.
리눅스 부트로더인 grub를 실행하라는 명령이다.
fs0:\EFI\debian\grubx64.efi
Debian 을 실행하면 대뜸 비밀번호를 요구한다.
설치시 만들었던 그리고 절대 잊지 말라고 했던 encrypt 암호를 입력하면 된다.
login은 root 계정으로 하고, root 암호를 입력한다.
sudo Install & Setting
apt-get 을 이용해 sudo를 설치할 것이다.
먼저 apt-get을 update해준다.
apt-get update
sudo 를 설치한다.
apt-get install sudo
/etc/sudoers 라는 파일에 sudo 관련 세팅이 저장되어 있으나 해당 파일은 readonly 파일으로 특수한 명령어를 통해 내용 변경이 가능하다.
visudo
과제 요구사항을 반영하여 설정을 다음과 같이 변경해준다.
ctrl+c로 종료를 하고 하단에 버퍼의 내용을 적용할 것이냐는 질문에 y, 그리고 저장할 파일 이름에서 .tmp를 지워주는 것을 잊지 말자.
ufw Install & Setting
UFW는 Uncomplicated Fire Wall의 약자이다.
리눅스 의 네트워크 보안장치인 ip table을 설정하는 것이 상당히 복잡하기 때문에 이를 쉽게 조작하게 도와주는 프로그램이 ufw이다.
ufw에 볼일은 한 가지이다.
4242번 포트를 제외한 모든 포트에서의 접근을 막는것.
일단 Install 해준다.
apt-get install ufw
설치는 되었지만, 실행중인 상태는 아니다.
ufw enable
위 명령으로 실행상태로 돌려주자 (ufw는 자동으로 시작시 실행하는 설정이 되어 있어 startup시 실행에 대해서는 따로 건들지 않아도 된다.)
모든 포트를 막고 4242만 열게한다.
ufw default deny
ufw allow 4242
ssh Install & Setting
openssh를 이용해 호스트와 ssh 연결을 할 것이다.
일반적으로 openssh는 깔려있다.
그러나 vim은 안깔려있다.
깔아준다.
ssh의 기본 포트는 22로 되어 있고, rootlogin 또한 허용하기에 이에대한 설정을 바꾸기 위해 /etc/ssh/sshd_config 파일을 조작한다.
vim /etc/ssh/sshd_config
systemctl restart ssh
를 통해 설정을 적용시킨다.
Port Forwarding
호스트 컴퓨터에서 Debian에 원격 접속하기 위한 SSH 설치와 포트 설정까지 완료 하였다.
이젠 Debian의 4242포트와 호스트의 4242포트를 연결 시키는 작업이 남았다.
Port Forwarding
네트워크
IP 주소란 Internet Protocol Address의 약어로 네트워크상에서 해당 단말으로 접근하기 위한 주소이다. 여기서 네트워크는 공용 네트워크와 사설 네트워크로 구분할 수 있다.
공용 네트워크는 인터넷 상에서 다른 이용자들과 교류할 수 있으며 공용(공인) IP 주소를 통해 나의 단말기에 접근할 수 있다. 따라서 공용 IP주소를 이용해 네트워크상에 공개된 자원에 대해 다른 사용자들이 마음대로 사용할 수 없도록 하기 위해 방화벽 등의 보안 장치가 필요하다.
사설 네트워크는 별다른 조작이 없다면 외부에서 접근하는 것이 불가능하다. 따라서 방화벽이나 별다른 보안장치를 설치하지 않기도 한다.
포트포워딩
내부망(사설네트워크)에 있는 컴퓨터를 공용 네트워크로 연결하기 위해선 내부망 자원 중 공용 네트워크와 연결되어 있는 자원의 포트와 연결할 내부 컴퓨터의 포트를 연결해 주어야 한다.
이러한 포트간 연결을 통해 두 컴퓨터를 잇는 작업을 포트 포워딩이라고 한다. 일반적으로 내부망 자원을 외부망과 연결을 위해 포트포워딩하지만, 이 과제에서는 외부망과 연결을 목적으로 하기보단 호스트컴퓨터와 가상컴퓨터와의 연결을 위해 포트포워딩을 한다.
이를 위해 호스트 컴퓨터의 4242 포트와 데비안의 4242 포트를 연결한다.
먼저 Debian의 사설 IP를 확인한다.
ip a
Debian을 종료하고 UTM 화면의 우측 상단 설정버튼을 누른다.
아래와 같이 변경해준다.
호스트의 쉘에서 다음과 같은 형식으로 데비안에 접속할 수 있다.
ssh \[ID이름\]@\[Debian의 사설 ip 주소\] -p \[호스트 포트 번호\]
짜잔~! iterm에서 Debian 에 접속한 모습이다!
Password Setting
이번엔 비밀번호 규칙(대문자, 중복방지 등)과 정책(변경 주기)을 설정할 차례이다.
3가지 할일이 있다.
- 비밀번호 규칙 설정
- 비밀번호 정책 설정
- 현재 사용중인 root, chanhale 계정 비밀번호 정책 설정 및 업데이트
비밀번호 생성규칙을 세팅하기 위해선 설치할 것이 하나 있다.
apt-get install libpam-pwquality
비밀번호 생성규칙을 바꾸기 위해 해당 파일로 접근한다.
vim /etc/pam.d/common-password
과제의 요구사항대로 파일의 내용을 변경한다.
다음은 비밀번호 변경 정책에 관한 설정을 할 차례이다.
관련 규칙이 작성되어 있는 파일에 접근한다.
vim /etc/login.defs
과제의 요구사항에 맞추어 설정을 다음과 같이 변경한다.
방금의 설정은 새로 생성한 계정에 적용되는 정책으로 이미 생성된 계정의 비밀번호 정책은 수동으로 세팅해주어야 한다.
chage -l [확인할유저명]
명령으로 이를 확인할 수 있다.
chage -m 명령으로 minimum을 바꿀 수 있고
chage -M 명령으로 Maximum을 바꿀 수 있다.
root와 로그인 유저 둘 다 변경해준다.
chage -m 2 [user_name]
chage -M 30 [user_name]
정책을 모두 변경했으니 과제 요구 사항대로 비밀번호도 변경해주자.
Group Setting
다음은 유저가 속한 그룹과 유저의 프라이머리 그룹을 변경해줘야 한다.
먼저 과제 요구사항에 나온 user42 라는 그룹을 만들자.
groupadd user42
유저가 소속된 그룹에 user42,sudo을 추가적으로 등록하도록 한다.
usermod
user + modify의 합성어로 유저의 속성을 변경하는 명령어이다. -aG 옵션과 -g옵션을 사용하게 되는데 의미는 다음과 같다.
-aG == --append: 반드시 -G옵션과 함께 써야 하며 인수로 넘겨진 유저가 속한 그룹에 인수로 넘긴 그룹을 추가해준다.
-g == --gid: 인수로 그룹과 유저를 받고 해당 유저의 초기 로그인 그룹(primary group)을 넘겨진 그룹으로 세팅한다. 유저 홈디렉터리에 있는 모든 파일들의 소유 그룹 명의 또한 새로운 그룹으로 갱신한다.
usermod -aG sudo,user42 [user_name]
usermod -g user42 [user_name]
ss -tunlp에서 dhclient 없애기
ss -tunlp 를 실행하면 과제의 요구사항과는 다르게 dhclient가 떡하니 존재하는 것을 확인할 수 있다.
ip할당을 동적으로 처리하는 세팅을 정적으로 할당하도록 바꿈으로써 이를 없앨 수 있다.
vim /etc/network/interfaces
을 하여 해당 설정 파일로 이동하고 다음과 같이 내용을 변경하자
이후 ss -tunlp
를 실행하면 과제 요구사항과 같은 결과를 확인할 수 있다.
monitoring.sh
컴퓨터의 상태정보를 출력하는 스크립트를 구성해야한다.
자세히 언급하긴 너무 양이 많아 그 동작들에 대해 간략하게 보여주는 식으로 넘어가겠다.
완성된 결과이다.
아키텍처
물리 CPU 개수
참고로 nproc 명령의 manpage 는 다음과 같다.
vCPU
메모리 사용량
free 의 man page
디스크 사용량
여기서 주의할 점은 used와 Available의 합이 총 공간이 된다는 점에 주의하여 스크립트를 짜야한다.
DF 의 man page
CPU 사용량
apt-get install sysstat
위 기능을 깔아야 cpu사용량 확인하는데 필요한 명령어를 실행할 수 있다.
Last Boot
Who의 man page
LVM 사용여부: 생략
TCP 연결 개수: 생략
로그인 계정 수: 생략
네트워크 IP
ip의 man page -1
ip의 man page -2
sudo 명령 청구 횟수
journalclt의 man page
스크립트 내용
** 중요 추가 **
겉보기엔 정상적인것 같지만… 아래 스크립트 내용 중 한가지 오류가 있어요
그게 무엇인지 찾고 수정하는 과정에서 명령들을 직접 실행해보고 오류를 찾길 바랍니다.
crontab setting
crontab은 어떤 함수? 라기보단 cron + table의 합성, 축약어 인 듯 하다. (cron은 유닉스 계열의 작업 스케줄러이다.) 즉 작업할 거리들이 모여있는 table을 뜻한다고 할 수 있겠다. 우리가 사용한 -e 옵션은 특정한 editor 를 사용하여 crontab의 내용을 edit하는 명령이다.
crontab -e
위 명령을 통해 접근한 cron table에 들어가 보면, 주석 외엔 별다른 내용이 보이지 않는다.
방금 만들었던 monitoring.sh를 실행하는 명령을 추가해준다.
*/10 * * * * /root/monitoring.sh | wall
위 명령의 의미는 먼저 ‘*’ 문자의 경우 아무 시간이라는 뜻이다.
앞에서부터 분, 시, 일, 월, 년 을 뜻하며 상기 명령은 10 분에 1번씩 실행하라는 명령이 되겠다.
다음으로 wall의 의미는 모든 사용자에게 출력한다는 뜻이다.
즉 ssh를 통해 호스트 컴퓨터에서 chanahle 계정으로 접속하든, 가상머신에서 새로운 계정으로 접속해있든 상관없이
monitoring.sh의 실행 결과를 전달 받을 수 있다.
기타 참고 사항
동료평가시 평가지 자체에 있는 내용도 어마어마하게 많으나 과제 요구사항 중 You must understand what you use! 라는 내용이 있다.
질문자가 평가지 외의 내용을 질문하더라도 답변하지 못하면 fail을 받을 수 있다는 의미로 해석될 수도 있다.
최대한 자세하게 준비해서 평가에 임하는 것을 추천한다.
shasum
_Running shasum is often the quickest way to compute SHA message digests. The
user simply feeds data to the script through files or standard input, and then
collects the results from standard output._
SHA(Secure Hash Algorithms)의 형식으로 된 데이터를 연산하고 그 결과를 표준 출력에 출력하는데 쓰이는 명령어이다.
tty
TTY 란 터미널 환경을 뜻한다. iterm과 같은 외부 터미널 환경은 pty 라고 하며 이 외에도 여러가지 환경이 있다.
[쉘과 터미널, 콘솔, tty, pty, pts 간단 정리](https://jootc.com/p/20170306208)
ssh
네트워크로 연결된 두 호스트간 rsa 암호화 기술을 사용하여 통신 중 데이터 노출의 위험 없도록 하는 보안 프로토콜이다. 과제에서는 오픈소스로 작성된 OpenSSH 프로젝트의 프로그램을 사용하였다. 디폴트로 설정된 22번 포트와 그외 모든 포트를 가상머신에서 막고, 4242번을 열어주고, 또한 버추얼박스의 세팅으로 호스트(맥)의 4242번 포트와 게스트의 4242번 포트를 연결하는 세팅을 진행한다. 이때 각각의 IP가 필요하다. 이렇게 되면 두 4242포트 간 ssh의 연결통로가 성립된다.
usermod
user + modify의 합성어로 유저의 속성을 변경하는 명령어이다. -aG 옵션과 -g옵션을 사용하게 되는데 의미는 다음과 같다.
-aG == --append: 반드시 -G옵션과 함께 써야 하며 인수로 넘겨진 유저가 속한 그룹에 인수로 넘긴 그룹을 추가해준다.
-g == --gid: 인수로 그룹과 유저를 받고 해당 유저의 초기 로그인 그룹(primary group)을 넘겨진 그룹으로 세팅한다. 유저 홈디렉터리에 있는 모든 파일들의 소유 그룹 명의 또한 새로운 그룹으로 갱신한다.
There are currently no comments on this article
Please be the first to add one below :)
내용에 대한 의견, 블로그 UI 개선, 잡담까지 모든 종류의 댓글 환영합니다!!