1. born2beroot

zinnnn37·2022년 10월 18일
0

🪐 42 SEOUL

목록 보기
4/10

1.1. Mandatory Part

1.1.0. Background knowledge

1.1.0.0. Virtual Machine

  • 가상머신
    : 물리적 컴퓨터와 동일한 기능을 제공하는 소프트웨어 컴퓨터
    : 물리적 컴퓨터처럼 어플리케이션과 운영체제를 실행하나, 가상머신은 물리적 컴퓨터에서 실행되고 물리적 컴퓨터처럼 작동하는 컴퓨터 파일
    : 호스트 컴퓨팅 환경에서 생성됨
    : 하나의 호스트에 여러 가상머신이 동시에 존재할 수 있음

  • 가상머신을 사용하는 이유

  1. 바이러스에 감염된 데이터에 액세스하고 운영체제를 테스트하는 등, 호스트 환경에서 수행하기 위험한 작업을 수행하기 위해 사용

  2. 가상머신은 *샌드박스화 되므로, 가상머신 내의 소프트웨어는 호스트 컴퓨터를 변조할 수 없다

    *샌드박스화: 외부로부터 받은 파일을 바로 실행하지 않고 보호된 영역에서 실행시켜봄으로써 외부로부터 들어오는 파일과 프로그램이 내부 시스템에 악영향을 주는 것을 미연에 방지하는 기술

  • 장점

    1. 유지, 관리가 간편하고 범용성이 뛰어남
    2. 하나의 물리적 컴퓨터에서 여러 운영체제 환경을 실행할 수 있음
  • 단점

    1. 하나의 물리적 시스템에서 여러 가상머신을 실행하면 성능이 불안정해질 수 있음
    2. 물리적 컴퓨터보다 효율성이 떨어지며 실행속도가 느림

1.1.0.1. Debian vs CentOS

  • Linux 운영체제
  1. Debian: 커뮤니티에서 만들어진 배포판
    -> 전문적인 회사에서 서비스하는 레드햇 계열에 비해 사후지원과 배포가 늦고, 내장 유틸의 성능이 레드햇 계열에 비해 부족한 감이 있었음
    - 현재는 무료 개인 사용자 서버용으로 인기가 높으며, 지속적인 업데이트로 레드햇 계열에 비해 성능이 처지지 않는다.
    - 넓은 유저층을 가지고 있어 사용법이 웹사이트나 커뮤니티에 자세히 기술되어 있다.
    - 개인용
    - 패키지 관리: deb 포맷dpkg/APT 매니저
  2. CentOS: Community Enterprise Operating System
    • 레드햇이 공지한 RHEL을 그대로 가져와 레드햇의 브랜드와 로고만 제거하고 배포한 배포판
      -> RHEL의 소스를 그대로 사용하여 RHEL과 OS 버전, Kernel의 버전, 패키지 구성이 똑같고, 바이너리가 100% 호환됨
    • 무료로 사용 가능하나, 문제 발생 시 레드햇이 아닌 커뮤니티를 통해 지원이 되기 때문에 패치가 느린 감이 있음
    • 서버용 운영체제로 인기가 높음(서버용으로 리눅스를 운영할 목적이라면 대부분 CentOS를 사용)
    • 기업용
    • 패키지 관리: rpm 포맷YUM/DNF 매니저
- 레드햇	: 레드햇에서 배포한 리눅스
	: 2003년까지 오픈소스 라이선스로 운영되다 이후 상용화
	: 커뮤니티가 아닌 회사에서 관리
	  -> 타 리눅스 배포판에 비해 패치가 빠름
	: 유틸리티의 양이 많고 관리 툴의 성능이 우수
	: 호환성이 좋음
	: 레드햇 계열 = 페도라, CentOS
	  -> 오늘날은 CentOS가 우세

1.1.0.2. apt vs aptitude

우분투에서 패키지를 관리하는 툴로 응용프로그램 설치 및 삭제, 최신버전 유지 등에 이용됨

  1. apt(Advanced Package Tool)
    • 오픈소스 툴
    • 실질적으로 dpkg와 함께 동작하지만 소프트웨어 검색, 설치, 업그레이드, 검사 등 대부분의 패키지 관리 작업은 apt 단독으로 가능
    • 그래픽 인터페이스 없이 명령어로 사용
    • 다른 high-level 패키지 매니저에서 사용될수 있음
      -> 다른 작업과 호환성이 높음
    • 데비안 패키지를 설치, 제거하는 데 사용되던 도구(apt-get, apt-cache) 등이 생기며 기능이 흩어지고 문제가 발생했는데, 이를 해결하기 위해 필요한 기능만 넣어 편리하게 만든 것
      ※ 패키지 삭제 시 사용되지 않는 패키지가지 같이 삭제하려면 -auto-remove, apt-getautoremove를 같이 사용해야 함
  2. aptitude
    • high-level 대화형 패키지 매니저
    • 텍스트 기반 대화형 UI가 제공되는 debian 패키지 관리자
    • 설치, 제거, 업데이트 과정에서 충돌이 발생하는 경우 다른 대안을 제시
      -> apt는 제시 없이 동작하지 않음
    • why, why-not 명령어로 특정 동작이 왜 되는지, 안 되는지 알 수 있음
    • 기능이 더 다양

high-level | 종속성 해결 및 메타 데이터 검색(aptitude)
low-level   | 설치, 업그레이드, 삭제(apt)

1.1.0.3 APPArmor(Application Armor)

  • 리눅스 어플리케이션 보안 시스템(오픈소스)
  • 내외부의 위협으로부터 운영체제와 어플리케이션을 보호함
  • MAC을 제공하여 UNIX DAC를 보완함
  • 프로그램에서 액세스 할 수 있는 파일을 지정하는 규칙 집합에 따라 프로그램을 제한한다
	sudo aa-status	# APPArmor가 포함되어 있는지 확인하는 명령
	aa-enabled		# APPArmor 활성화 여부 출력

1. MAC(Mandatory Access Control): 강제접근통제
- 미리 정해진 정책과 보안 등급에 의거하여 주체에게 허용된 접근 권한과 객체에게 부여된 허용등급을 비교하여 접근을 통제함
- 관리자만 객체의 보안레벨과 주체의 보안등급을 수정 가능
- 높은 보안을 요구하는 정보는 낮은 보안 수준의 주체가 접근할 수 없으며, 소유자라 할 지라도 정책에 어긋나면 객체에 접근할 수 없음
    -> 루트로 구동한 http 서버라도 접근 가능한 파일, 포트가 제한됨(사전에 허용된 포트, 폴더에만 접근 허용)
    -> 구현이 복잡하고 어려우며, 모든 주체와 객체에 대해 보안 등급과 허용 등급을 부여해야하므로 설정이 복잡하고 시스템 관리자가 접근 통제에 대해 잘 이해하고 있어야함

2. DAC(Discretionary Access Control): 임의 접근 통제
- 시스템 객체에 대한 접근을 사용자나 그룹의 신분을 기준으로 제한하는 방법
- 객체의 소유자는 다른 주체의 객체에 대한 접근 권한을 설정할 수 있음(A를 가지고 있는 경우, 다른 주체의 A에 대한 접근 가능성 여부를 설정할 수 있음)
- 임의 = 소유자는 자신의 판단에 의해 임의로 권한을 줄 수 있다
- 구현이 용이하고 사용하기 편함
- 대부분의 운영체제의 기본 접근 통제 모델
    사용자의 권한을 탈취당하면 사용자가 소유하는 모든 객체의 접근 권한을 가짐. 특히 root 계정은 모든 권한을 가지기 때문에 root 권한 탈취 시 시스템 완벽 장악 가능

1.1.1. Setup

1.1.1.0. ufw와 ssh 실행여부 확인

	sudo ufw status verbose
    systemctl status sshd

1.1.2. user

1.1.2.0. user group

	sudo groupadd [group] # 그룹 생성 명령어
	sudo usermod -aG [group1],[group2]... [user]
	# 한 번에 사용자를 여러 그룹에 추가
	sudo useradd -g [group1] -G [group2],[group3]... [user]
	# 사용자 그룹에 추가
  • -g: 사용자의 1차 그룹 지정
  • -G: 사용자의 2차 그룹 지정

1.1.2.1. password 조건 설정

	vi /etc/login.defs

	PASS_MAX_DAYS 30	# 만료되기까지의 기간
	PASS_MIN_DAYS 2		# 비밀번호 의무 사용일
	PASS_MIN_LEN 10		# 최소 글자
	PASS_WARN_AGE 7		# 비밀번호 만료 경고 메시지 출력 날짜
  
  	# chage 명령어 사용
  	chage -l [user]	# 비밀번호 관련 정보 출력
  	sudo chage -m n [user]	# 비밀번호 의무 사용일을 n일로 변경
  	sudo chage -M n [user]	# 비밀번호 최대 사용일
  	sudo chage -W n [user]	# 비밀번호 만료 경고 메시지 출력 날짜
  	sudo apt install libpam-cracklib
  	vi /etc/pam.d/common-password
	pam_cracklib.so ~
  • retry=N: 재시도 가능 횟수
  • minlen=N: 최소 길이. 각 문자(숫자, 대소문자, 특수문자)를 사용한 것에 대해 각각 credit을 적용
  • difok=N: 이전 암호와 비교했을 때 최소 N개 이상 달라야 함
  • dcredit=N: N < 0인 경우 숫자의 최소 갯수, N >= 0인 경우 숫자에 주어지는 credit 값. 기본값 1
  • ucredit=N: 대문자가 가지는 credit
  • lcredit=N: 소문자가 가지는 credit
  • ocredit=N: 특수문자가 가지는 credit
    • minlencredit: minlen=10이면 비밀번호의 길이는 10이 되어야 한다. 만약 dcreditucredit이 각각 1이고 , ocredit이 2이고 세 문자를 모두 사용했다면 총 4 credit을 얻는다. 따라서 minlen의 10 credit에서 4 credit을 제외하여 실제적으로 6글자 이상의 패스워드도 통과되는 것이다.
  • maxrepeat=N: 연속하는 문자 N개까지 허용
  • reject_username: 암호가 계정의 이름을 포함하지 않도록 함
  • enforce_for_root: root 계정에도 상기 내용 강제
	sudo passwd -e [user] # 재로그인 시 비밀번호 변경 강제
  • user, group 관련 명령어
    1. 생성
      sudo adduser [user]
    2. 그룹
      sudo groupadd [group]
      sudo groupdel [group]
      cat /etc/group # 그룹 조회
    3. 그룹 설정
      sudo usermod -aG [group],[group]... [user]
    • a 옵션: add 옵션
    • G 옵션: 명령어에 명시한 그룹들에 사용자 포함. G 옵션을 포함하지 않으면 명시되지 않은 그룹에서는 삭제되므로 a 명령어를 사용할 때 같이 사용하는 경우가 많음
      -> sudo usermod -G sudo user: user는 sudo 그룹에만 속하게 됨
    1. 삭제
      sudo userdel -r [user]: -r 옵션을 붙여주지 않으면 홈 디렉토리 등 삭제되지 않는 정보가 있을 수 있음
    2. 모든 사용자 확인
      cat /etc/passwd
  • adduser vs useradd
    : adduser는 기본 계정 정보, 홈 디렉토리, 쉘 설정 등을 사용자를 생성하며 한 번에 진행
    : useradd는 계정만 생성 후 다른 정보는 따로 설정

1.1.3. hostname & partitions

1.1.3.0 hostname 확인

	hostname
  	# or
  	hostnamectl | grep hostname

1.1.3.1. hostname 변경

	sudo hostnamectl set-hostname [hostname]
    # 이후 reboot

⚠️ sudo: unable to resolve host linux [hostname] ⚠️
-> /etc/hosts 파일에서 이전 호스트명을 새로운 호스트 명으로 변경하면 문제가 해결된다

1.1.3.2. 가상머신 파티션 확인

	lsblk

1.1.3.3. LVM(Logical Volume Manager)

  • 리눅스의 저장공간을 효율적이고 유연하게 관리하기 위한 커널의 한 부분
    -> 5GB가 할당된 /home 파티션을 10GB로, 1GB로 자유롭게 크기를 늘렸다 줄였다 할 수 있음

  • LVM vs 일반 disk partitioning

    • LVM: 파티션 대신 volume 단위로 저장장치를 다룸
              : 저장공간 확장 및 변경에 유연하며 크기를 변경할 때 기존 데이터의 이전이 필요 없음
    • 일반 : 하드디스크를 파티셔닝한 후 OS 영역에 마운트하여 읽기와 쓰기를 진행
              : 저장공간의 크기가 고정되어 증설 및 축소가 어려움
      ※ 마운트(Mount): LV을 실제로 사용할 수 있도록 파일 시스템과 디렉토리 영역을 연결하도록 함

  • LVM의 장점
    1. 유연한 용량 조절
    2. 크기 조절이 가능한 Storage pool
    3. 편의에 따른 장치 이름 지정 가능
    4. disk striping, mirror volume 등을 제공

1.1.4. sudo

  • UNIX 및 UNIX 계열 운영체제에서 다른 상용자의 보안 권한(보통은 슈퍼유저)으로 프로그램을 구동할 수 있도록 하는 프로그램. superuser do에서 유래했으며, 후에 substitute user do(다른 사용자의 권한으로 실행)의 줄임말로 해석되고 있음.
  • su는 로그아웃을 하지 않고 지정된 user로 전환할 수 있음. 따라서 root 권한을 부여하는 경우 실수 혹은 권한 남용으로 리눅스 시스템 자체에 문제가 생길 수 있음.
  • sudo는 비밀번호 공유가 필요치 않아 su 보다 보안성이 높음

1.1.3.0. sudo 설치 확인

	dpkg --get-selections | grep sudo

1.1.3.1. sudo group에 user 할당

  	sudo usermod -aG sudo [user]
  
  	groups [user]		# sudo 권한 추가 확인
  
  	/var/log/sudo/00/00	# sudo log 확인
  • log: sudo 실행 시 실행한 위치와 실행한 명령어의 위치 저장
  • stderr: 실행한 명령어가 오류로 인해 실행되지 않았을 경우 출력되는 내용 저장
  • stdin: 실행한 명령어가 표준 입력을 받은 내용을 저장
  • stdout: 실행한 명령어가 표준 출력한 내용을 저장
  • timing: session이 실행된 시간 저장
  • ttyin: tty로 입력받은 내용 저장
  • ttyout: tty로 출력한 결과 저장

1.1.3.2. sudo 규칙 설정

  	sudo visudo # nano 편집기로 규칙 설정
  	
  	Defaults	passwd_tries=3			# sudo 로그인 시도 횟수
  	Defaults	badpass_message="txt"	# 비밀번호 오류 메시지
  	Defaults	log_input				# sudo 명령어 실행 시 함께 실행된 명령어를 log에 저장
  	Defaults	log_output				# sudo 명령어의 실행 결과를 log에 저장
  	Defaults	iolog_dir="PATH"		# sudo log를 저장할 경로
  	Defaults	requiretty				# sudo 명령어 실행 시 tty 강제
  • tty 강제: ttyteletypewriter의 줄임말. 즉, sudo 명령어는 반드시 콘솔(터미널)에서 실행되도록 강제하라는 의미

1.1.5. UFW(Uncomplicated FireWall)

1.1.5.0. UFW?

  • Ubuntu의 기본 방화벽은 iptable
  • 이를 조금 더 쉽게 사용할 수 있도록 하는 것이 ufw
  • 비교적 간단한 명령어로 방화벽을 설정할 수 있다
    -> 그러나 포트 포워딩 명령은 없어 iptable 명령어를 사용해야 함

1.1.5.1. UFW 규칙 확인

	sudo ufw status verbose

1.1.5.2. UFW 규칙 생성

  	# 설치
  	sudo apt install ufw

  	# 사용
  	sudo ufw enable		# 켜기
  	sudo ufw disable	# 끄기
  	
  	# 명령
  	sudo ufw show raw			# 기본 규칙 확인
  	sudo ufw default allow		# 모두 허용
  	sudo ufw default deny		# 모두 거부
  	sudo ufw allow [port]		# 특정 포트 허용
  	sudo ufw deny [port]		# 특정 포트 거부
  	sudo ufw delete [line num]	# 해당 줄의 규칙 제거
	# TO			Action		From
  	# --			------		----
  	# 4242			ALLOW IN	Anywhere
  	# 4242 (v6)		ALLOW IN	Anywhere (v6)
  	#
  	# $ sudo ufw delete 2 -> 4242 (v6) 삭제
  	# $ sudo ufw delete 1 -> 4242 삭제
    sudo ufw reset # UFW 재설정(방화벽 비활성화 + 모든 규칙 삭제)

1.1.6. SSH(Secure Shell)

1.1.6.0. SSH?

  • 원격으로 다른 시스템에 로그인할 수 있는 대표적인 프로그램
    -> 다중 접속을 허용하는 리눅스에서는 하나의 서버에서 여러 클라이언트에 접속해 관리해야 하는 경우가 많음. 이럴 때 SSH와 같은 원격 프로그램이 유용하게 사용됨.
  • 패킷 전송 시 암호화해서 전송하므로 안전하게 전송할 수 있고, 혹여나 도청 당하더라도 암호화된 파일이므로 내용 파악이 불가능
    -> 보안성이 높음

1.1.6.1. settings

  	sudo apt install openssh-server	# 설치
  	systemctl status sshd			# 상태 확인
  	sudo systemctl enable			# 활성화
	sudo ufw allow 4242				# 4242 포트 허용
	sudo vi /etc/ssh/sshd_config
  	Port [port]						# ssh 포트 설정(기본 포트 22)
  	PermitRootLogin yes/no			# 루트 접속 허용 여부
    sudo systemctl restart sshd		# ssh 재시작
  
  	sudo netstat -anp | grep LISTEN | grep sshd
  	# 포트가 제대로 열렸느지 확인
  • ssh 접속
  	ssh -p 4242 <user>@<Host ip>
  	# ssh -p 4242 minjinki@127.0.0.1
  
  	# ssh로 접속할 서버에 public key 복사
  	ssh-copy-id -p 4242 <user>@<host ip>
  	# ssh-copy-id -p 4242 minjinki@127.0.0.1
  • 포트 포워딩(port forwarding)
    : 특정한 포트로 들어오는 데이터 패킷을 다른 포트로 바꿔서 다시 전송

1.1.7. monitoring.sh

1.1.7.0. cron?

  • 작업 예약 스케쥴러
  • 리눅스 계열에서 특정 시간에 특정 작업을 하는 데몬
  • cron이 언제, 무엇을 하는지 특정 파일에 저장하는 것이 crontab. 즉, cron이 원하는 시간에 원하는 명령 또는 프로그램을 수행하도록 명령 리스트를 만드는 것이 crontab 작업
  • 특정 시간에 특정 작업을 해야할 때, 반복된 시간에 반복된 작업을 해야할 때, 예약 작업을 사용해야할 때 사용
  	sudo service cron start		# 크론탭 시작
  	sudo service cron stop		# 크론탭 중지
  	sudo service cron status	# 크론탭 작동 여부 확인
  
  	crontab -e					# 크론탭 시작
  	crontab -l					# 크론탭 출력
  	crontab -r					# 크론탭 삭제(모든 규칙 삭제)
	sudo service cron restart	# 서비스 재시작
  • crontab 문법
  	* * * * * cmd # 한 줄에 하나의 명령
  # - - - - -
  #	│ │ │ │ ⎿	요일(0~7, 0과 7은 일요일, 1~6: 월~토)
  # │ │ │ ⎿ _	달(1~12)
  # │ │ ⎿ _ _	일(1~31)
  # │ ⎿ _ _ _	시간(0~23)
  # ⎿ _ _ _ _	분(0~59)
  #
  # * 1 * * * ls -l		-> 1시마다 ls -l
  # */1 * * * * ls -l 	-> 매 1분마다 ls -l 실행
  # 30 */6 * * * ls -l	-> 매 6시간마다 30분에(0:30, 6:30...)

1.2. Bonus Part

1.2.0. partitions

  • 데비안 설치 시 파티셔닝할 때 직접 지정

1.3. Peer-evaluation

1.3.0. shasum

  1. 터미널에서 가상머신 폴더로 이동
  	shasum [name].vdi
  1. 위 명령어로 가상머신의 서명을 확인 가능
    -> git repo에 push된 서명과 일치하면 평가 진행

0개의 댓글