Virtual Box로 OS만들기

Seungsoo Lee·2022년 7월 7일
0

system programming

목록 보기
1/1

date: 2021-10-19 23:16:00


목표

VirtualBox을 이용해 나만의 규칙을 적용한 operating system 을 만드는것






개념 정리

Virtual Machine

  • Virtual Machine 이란?
    • 컴퓨터 안에 또 다른 컴퓨터를 동작 시키는 것이다.
    • 하드웨어를 소프트웨어적으로 구현해서 그 위에서 운영체제가 작동하도록하는 기술

  • Virtual Machine 이 작동하는 원리
    • VM(Virtual Machine)은 물리적 하드웨어 시스템에 구축되어 자체 CPU, 메모리, 네트워크 인터페이스 및 스토리지를 갖추고 가상 컴퓨터 시스템으로 작동하는 가상 환경입니다.
    • 여기서 하이퍼바이저라 불리는 소프트웨어는 하드웨어에서 가상 머신의 리소스를 분리하고 적절하게 프로비저닝하여 VM에서 사용할 수 있도록 합니다.



Debian 이란?


  • 무료 오픈소스로 구성된 리눅스 배포판이며, 커뮤니티에 의해 관리됩니다. Debian은 리눅스 커널을 기반으로 한 가장 오래된 os중 하나 입니다.

  • 데비안(Debian)은 데비안 프로젝트에서 만들어 배포하는 공개 운영체제이다.

  • 데비안의 특징은 패키지 설치 및 업그레이드의 단순함에 있다.

  • 일단 인스톨을 한 후 패키지 매니저인 apt 등을 이용하면 소프트웨어의 설치나 업데이트에서 다른 패키지와의 의존성 확인, 보안관련 업데이트 등을 자동으로 해준다.

  • 데비안은 네트워크 결합 스토리지 부터 전화기, 노트북, 데스크탑 및 서버까지 다양한 하드웨어에서 사용할 수 있다.

  • 데비안은 안정성과 보안에 중점을 두며 다른 많은 리눅스 배포판의 기반으로 쓰이고 있다.




CentOs 와 Debian 차이점




virtual machine의 목적


  • 다른 운영체제를 사용해야 하는 경우(맥OS에서 윈도우, 윈도우에서 리눅스)

  • 독립된 작업공간이 필요한 경우 (바이러스 회피, 백업)

  • 하나의 머신에서 여러명에게 운영체제 환경을 제공




aptitude와 apt의 차이는?





APPArmor는 무엇인가?


  • 시스템 관리자가 프로그램 프로필 별로 프로그램의 역량을 제한할 수 있게 해주는 리눅스 커널 보안 모듈이다.

  • 프로필들은 네트워크 액세스, raw 소켓 액세스 그리고 파일의 읽기, 쓰기, 실행 같은 능력을 허용할 수 있다.

  • AppArmor는 강제적 접근 통제(MAC)를 제공함으로써 전통적인 유닉스 임의적 접근 통제(DAC) 모델을 지원한다.

  • 이것은 리눅스 버전 2.6.36부터 포함되었으며, 개발은 2009년부터 캐노니컬 사에 의해 지원된다.





체크리스트

1)Setup


  • 그래픽환경에서 동작하지 않는 것을 확인 (Ensure that the machine does not have a graphical environment at launch)

  • root가 아닌 사용자로 login (Connect the user not root)

  • password를 활용해서 machine에 로그인. (Password should be ruled as subject it saids) (->2)User)


UFW가 동작해야함 (Check that the UFW service is working) (->5)UFW)

sudo ufw status verbose 

SSH service가 동작해야함 (Check that the SSH service is working) (->6)SSH)

sudo systemctl status ssh

선택한 OS가 무엇인지 확인해야함. (Check the OS)

sudo hostnamectl



2)User


  • 현재 사용자의 group status를 확인하기 (Check current user group status)
    • id 사용자명


비밀번호 정책 (password policy)


  • 비밀번호는 30 일마다 만료되어야합니다.

  • 비밀번호 수정 전까지 허용되는 최소 일수는 2로 설정됩니다.

  • 사용자는 암호가 만료되기 7 일 전에 경고 메시지를 받아야합니다.

  • 비밀번호는 10 자 이상이어야합니다. 대문자와 숫자를 포함해야합니다. 또한 3 개 이상의 연속 된 동일한 문자를 포함 할 수 없습니다.

  • 암호에는 사용자 이름이 포함되지 않아야합니다.

  • 다음 규칙은 루트 비밀번호에 적용되지 않습니다. : 비밀번호는 이전 비밀번호의 일부가 아닌 최소 7 자.



password policy 변경법


set password complexity (1 ~ 3)

sudo vi /etc/login.defs

(비밀번호 정책 변경) set password complexity (4 ~ 6)

sudo apt install libpam-pwquality
  • PAM module to check password strength

sudo vi /etc/pam.d/common-password
  • (변경) retry=3 : 암호 입력 3회까지

  • minlen=10 : 암호 최소 길이는 10

  • difok=7 : 기존 패스워드와 달라야하는 문자 수는 7

  • ucredit=-1 : 대문자 한 개 이상

  • lcredit=-1 : 소문자 한 개 이상

  • dcredit=-1 : 숫자 한 개 이상

  • reject_username : username이 그대로 또는 뒤집혀서 새 패스워드에 들어있는지 검사하고, 들어있으면 거부

  • enforce_for_root : root 사용자가 패스워드를 바꾸려고 하는 경우에도 위의 조건들 적용


root계정과 현존하는 사용자 계정의 암호 변경을 강제한다. 다음 번 로그인시에 암호를 변경하라고 뜨게 된다.

sudo passwd -e 사용자명

새로운 사용자 추가하기 (Add User)

sudo adduser 사용자명

evaluating이라는 그룹 만들기 (Create group 'evaluating')

sudo groupadd evaluating
  • password 정책의 장단점 (Advantage and Disadvantage of Password policy)



3)Hostname and Partitiions


hostname 확인하기 (Check Hostname)

sudo hostnamectl

hostanem 변경하기 (Change Hostname)

sudo hostnamectl set-hostname 바꾸려는호스트명

파티셔닝 상태 확인하기 (Check partioning status)

lsblk
  • LVM이 무엇인가?



4)Sudo


Check sudo installed

dpkg -l sudo

Install sudo

apt-get install sudo


Group


Add new user in primary group

usermod (user) -g (group)

Add new user in secondary group

usermod -aG (group1),(group2) (user)"

Check groups

cat /etc/group

Delete user from group

sudo deluser 사용자명 그룹명

Delete user

sudo userdel -r 사용자명


Sudoer file setting


로그 파일을 저장할 경로 생성

sudo mkdir /var/log/sudo/

'/etc/sudoers'파일을 수정

sudo visudo
  • (변경) Defaults secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

    • sudo 만의 환경변수 설정
  • Defaults authfail_message="Authentication attempt failed."

    • 권한 획득 실패시 띄울 커스텀 메세지
  • Defaults badpass_message="Wrong password!"

    • 암호 실패시 띄울 메세지
  • Defaults log_input

    • sudo를 통해 입력된 input은 로그에 기록된다.
  • Defaults log_output

    • sudo를 통해 입력된 output은 로그에 기록된다.
  • Defaults requiretty

    • tty에 연결되지 않은 채로 sudo를 실행하는 것을 금지? ex. 쉘 스크립트 상에서 sudo 커맨드 수행 금지.
  • Defaults iolog_dir="/var/log/sudo/"

    • 로그를 저장할 경로.
  • "/var/log/sudo" Check



5)UFW


Install UFW

sudo apt install ufw

Check UFW installed

sudo ufw status verbose

부팅 시 ufw 활성화되게 설정

sudo ufw enable

기본 incoming deny로 설정

sudo ufw default deny

  • UFW 란?

    • UFW(Uncomplicated Firewall,언컴플리케이티드 방화벽)는 데비안 계열 및 다양한 리눅스 환경에서 작동되는 사용하기 쉬운 방화벽 관리 프로그램이다.
    • https://ko.wikipedia.org/wiki/UFW


ssh연결 허용(4242라는 커스텀 포트 사용하는 경우)

sudo ufw allow 4242

UFW rules list

sudo ufw status numbered

Delete UFW rule

sudo ufw delete 규칙번호



6)SSH


SSH 설정


Check SSH installed

apt search openssh-server

Install SSH

apt install openssh-server

openssh 실행 여부와 사용 포트

systemctl status ssh

  • SSH 란?

    • Secure Shell (SSH)
    • 원격지 호스트 컴퓨터에 접속하기 위해 사용되는 인터넷 프로토콜. 보통 축약해서 SSH라고 부른다. 뜻 그대로 보안 셸이다. 기존의 유닉스 시스템 셸에 원격 접속하기 위해 사용하던 텔넷은 암호화가 이루어지지 않아 계정 정보가 탈취될 위험이 높으므로, 여기에 암호화 기능을 추가하여 1995년에 나온 프로토콜이다.
    • https://ko.wikipedia.org/wiki/시큐어_셸

SSH Port 설정 보기

ss -tunlp

4242port 허용

sudo ufw allow 4242


VM에서 포트포워딩 설정(Access as new user at terminal)


설정 > 네트워크 > 고급 > 포트포워딩

호스트 IP : 접속 컴퓨터 ip, host port 2424, 게스트 IP : 10.0.2.15, guest port: 4242

연결

ssh seungsle@192.000.000.000 -p 2424
  • ssh <계정 이름>@<서버 주소> -p 포트번호


ssh 접속 root 계정 제한 방법


ssh 설정 파일

vi /etc/ssh/sshd_config

no로 변경

PermitRootLogin no

저장후 ssh 다시시작

service ssh restart



7)Script monitering


이를 /monitoring.sh로 작성하고 "chmod +x /monitoring.sh"을 통해 실행 권한 부여.

그 후 /monitoring.sh | wall하면 모든 사용자에게 스크립트 출력 내용이 띄워지게 된다.

#!/bin/bash

printf "#Architecture: "
uname -a

printf "#CPU physical : "
nproc --all

printf "#vCPU : "
cat /proc/cpuinfo | grep processor | wc -l

printf "#Memory Usage: "
free -m | grep Mem | awk '{printf"%d/%dMB (%.2f%%)\n", $3, $2, $3/$2 * 100}'

printf "#Disk Usage: "
df -BM -a | grep /dev/mapper/ | awk '{sum+=$3}END{print sum}' | tr -d '\n'
printf "/"
df -BG -a | grep /dev/mapper/ | awk '{sum+=$2}END{print sum}' | tr -d '\n'
printf "GB ("
df -BM -a | grep /dev/mapper/ | awk '{sum1+=$3 ; sum2+=$2 }END{printf "%d", sum1 / sum2 * 100}' | tr -d '\n'
printf "%%)\n"

printf "#CPU load: "
mpstat | grep all | awk '{printf "%.1f%%\n", 100-$13}'

printf "#Last boot: "
who -b | sed 's/ system boot //g'
#(주석) 'system boot'앞 뒤로 적절한 갯수의 스페이스 집어넣었음

printf "#LVM use: "
if [ "$(sudo lvscan | grep -i ACTIVE | wc -l)" -gt 0 ] ; then printf "yes\n" ; else printf "no\n" ; fi

printf "#Connections TCP : "
ss -t | grep -i ESTAB | wc -l | tr -d '\n'
printf " ESTABLISHED\n"

printf "#User log: "
who | wc -l

printf "#Network: IP "
/sbin/ifconfig | grep broadcast | sed 's/inet//g' | sed 's/netmask.*//g' | sed 's/ //g' | tr -d '\n'
printf " ("
/sbin/ifconfig | grep 'ether ' | sed 's/.*ether //g' | sed 's/ .*//g' | tr -d '\n'
printf ")\n"

printf "#Sudo : "
grep 'sudo:' /var/log/auth.log | grep 'COMMAND=' | wc -l | tr -d '\n'
printf " cmd\n"
  • os의 아키텍쳐와 커널 버전 : "uname -a"를 통해 출력

  • the number of physical processors : "nproc --all"을 통해 설치된 프로세서의 갯수를 출력

  • the number of virtual processors : "cat /proc/cpuinfo | grep processor | wc -l"을 통해 가상 프로세서(vCPU)의 갯수를 출력

  • the available RAM on your server and its utilization rate as a percentage : "free -m | grep Mem | awk '{printf "%d/%dMB (%.2f%%)", $3, $2, $3/$2 * 100}'"

  • the available memory on your server and its utilitzation rate as a percentage : "df -BM -a | grep /dev/mapper"

  • the utilization rate of your processors as a percentage : "sudo apt-get install sysstat" && "mpstat | grep all | awk '{printf "%.2f%%", 100-$13}'"

  • the date and time of the last reboot : "who -b | sed 's/ system boot //g'"

  • Whether LVM is active or not : if [ "$(lvscan | grep -i ACTIVE | wc -l)" -gt 0 ] ; then echo "yes" ; else echo "no" ; fi

  • The number of active connections. : "ss -t | grep -i ESTAB | wc -l"하면 현재 established tcp 연결 수 출력

  • The number of users using the server. : "who | wc -l"

  • The IPv4 address of your server and its MAC (Media Access Control) address. : IPv4는 "/sbin/ifconfig | grep broadcast | sed 's/inet//g' | sed 's/netmask.//g' | sed 's/ /g' "를 통해 추출 가능. MAC은 "/sbin/ifconfig | grep 'ether ' | sed 's/.ether //g' | sed 's/ .*//g' "을 통해 추출 가능

  • The number of commands executed with the sudo program. : "grep 'sudo:' /var/log/auth.log | grep 'COMMAND=' | wc -l"을 통해 출력 가능

  • Cron이란?

    • 유닉스 계열 컴퓨터 운영체제의 시간 기반 잡 스케줄러이다. 소프트웨어 환경을 설정하고 관리하는 사람들은 작업을 고정된 시간, 날짜 간격에 주기적으로 실행할 수 있도록 스케줄링하기 위해 cron을 사용한다.
    • "sudo crontab -e"를 통해 root 계정의 crontab 스케쥴러를 열고 난 후 "/10 * * * /monitoring.sh | wall"을 입력하여 매 10분마다 root권한에서 "/monitoring.sh | wall"이 실행되도록 한다.
    • https://jdm.kr/blog/2
    • https://velog.io/@taeskim/cron



8)Bonus


lighttpd, MariaDB 및 PHP 서비스를 사용하여 기능적인 WordPress 웹 사이트를 설정합니다.


워드프레스를 설치하려면 PHP를 사용할 수 있는 웹서버와 데이터베이스 서버가 필요하다.

  • web server : lighttpd
  • database : MariaDB

제가 올린 글에서 잘못된 부분이 있으면 제 메일로 연락주세요!


이승수의 저작물인 이 저작물은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

0개의 댓글