VirtualBox로 기본적인 리눅스 서버(Debian 환경 구축해보기)

김성준·2021년 5월 28일
0
post-thumbnail

요약

지금까지 리눅스는 한 번도 사용해본적이 없고 서버를 관리해본 적도 없었다. 윈도우와 GUI에 익숙한 내가 다른 운영체제와 CLI와 조금 친해지게 되는 시간이었다. 그동안 아무 생각 없이 윈도우만을 사용했기 때문에 각 운영체제 간 어떤 차이가 있는지 고려해 본적이 없었다. 이번엔 여러 리눅스 운영체제 중에서도 어떠한 것이 좋을지 스스로 고민해 볼 수 있었다. 또한 그동안 생각해본적 없던 보안에 대해서도 생각해보게 되었다. 어떤 비밀번호 정책이 효과적일지, sudo는 왜 사용해야 하는지 생각해봤다. 이외에도 SSH와 CRON의 사용법과 리눅스에 대한 것은 아니지만 VirtualBox라는 가상머신 툴의 사용법도 공부할 수 있던 시간이었다.

본문

준비물

설치과정

sudo 권한 설정하기

sudo를 설치하지 않고, sudo를 실행 할 경우.

$> sudo
-bash: sudo: command not found

sudo를 설치해봅시다.

$> su
$> apt-get install -y sudo
# Optional
# $> apt-get install -y vim

sudo가 설치됐습니다! 이제 sudo를 사용할 수 있는 권한을 설정해야 합니다.
설정을 편하게 하기 위해 vim이 필요하기 때문에 미리 설치하면 좋습니다.
sudo 권한 설정파일 경로: /etc/sudoers

$> chmod +w /etc/sudoers
$> vim /etc/sudoers
# do something...
$> chmod -w /etc/sudoers

하지만 vim으로 파일을 열어보면 읽기전용이라 파일을 수정할 수 없다고 합니다. :q로 파일을 닫고 chmod +w /etc/sudoers 명령어를 통해 쓰기권한을 줍니다. 다시 열어보면 수정이 가능합니다! root계정 밑에 우리가 sudo권한을 줄 계정이름을 입력해주고 나머지는 root계정과 똑같이 적어줍니다.
이 사진에서 권한 설정 파트의 각 부분이 어떤 것을 의미하는지 알 수 있습니다.

  • 첫번째 필드는 뒤에 나오는 룰을 적용할 계정이름입니다.
  • 두번째 필드는 룰을 적용할 호스트를 의미합니다.
  • 세번째 필드는 어떤 계정에 접근할 수 있는지를 표시합니다.
  • 네번째 필드는 어떤 그룹에 접근할 수 있는지를 표시합니다.
  • 다섯번째 필드는 어떤 명령어를 사용할 수 있는지를 표시합니다.

그룹을 만들고 계정 추가해보기

$> sudo groupadd user42
$> sudo gpasswd -a seongjki user42
$> sudo gpasswd -a seongjki root
  • groupadd 명령어로 user42라는 그룹을 만들어줍니다.
  • gpasswd 명령어의 -a 옵션으로 seongjki 계정을 user42와 root그룹에 추가해줍니다.

방화벽 설정하기

$> sudo apt-get install ufw
$> sudo ufw status
Status: inactive
$> sudo ufw enable
Firewall is active and enabled on system startup
$> sudo ufw allow 4242
Rule added
Rule added (v6)
  • apt 명령어로 ufw를 설치
  • ufw status 명령어로 현재 ufw의 상태 확인
  • ufw enable 명령어로 ufw 활성화
  • ufw allow 명령어로 이후 ssh연결에 사용할 4242번 포트 개방
  • ufw status 명령으로 ufw의 상태와 개방되거나 차단된 포트 확인 가능

ssh 설정하기

$> apt-get install -y openssh-server
$> sudo vi /etc/ssh/sshd_config
# do something...
$> sudo service ssh restart
  • apt 명령어를 이용해서 ssh를 설치합니다.(기본적으로 설치 되있지만, 혹시 설치 안됐을 경우를 대비)
  • sshd_config에서 port를 4242로 수정해줍니다.
  • servce ssh restart 명령어로 ssh를 재시작 해줍니다.

VirtualBox 포트포워딩하기

  • Settings에 Network탭으로 갑니다.
  • Advanced 화살표를 누르면 Port Forwarding버튼이 있습니다. 누릅니다.
  • 우측의 +를 눌러서 새 Rule을 만듭니다.
  • 호스트 IP에는 127.0.0.1을 입력합니다.
  • 게스트 IP에는 Debian에서 확인한 IP를 입력.
  • 포트에는 둘 다 4242를 입력해줍니다. (아까 열어 놓은)

ssh를 이용해 접속하기

$> ssh -p 4242 user_name@host_ip
  • 명령어를 입력하면 통신을 위한 ECDSA key를 만들지 물어봅니다.
  • yes를 입력하면 key가 생성되고 ssh를 이용해 서버에 접속하게 됩니다.

비밀번호 규칙 만들어 보안 개선하기

$> sudo vim /etc/login.defs
#do something...
$> sudo apt-get install -y libpam-pwquality
$> sudo vim /etc/pam.d/common-password
#do something...
$> passwd
#do something...
sudo: 3 incorrect password attempts

sudo 명령어 입력 후 비밀번호 틀렸을 시 나오는 문구 바꾸기

  • PASS_MAX_DAYS: 계정 비밀번호의 만료기간

  • PASS_MIN_DAYS: 계정 비밀번호 변경까지의 최소기간

  • PASS_WARN_AGE: 계정 비밀번호 만료 경고까지의 기간

  • apt 명령어로 필요한 툴들을 설치합니다.

  • 비밀번호 규칙을 설정할 수 있는 파일을 엽니다.

  • retry 뒤로 규칙을 나열하면 됩니다. (규칙들은 /etc/security/pwquality.conf에서 확인)

  • enforce_for_root는 이 규칙들을 root계정에도 똑같이 적용한다는 의미.

  • passwd 명령을 통해 규칙이 적용되었는지 검사.

  • 복잡한 비밀번호 정책의 장단점 : 대문자, 소문자, 특수문자, 숫자 등을 포함해야 하는 복잡한 비밀번호 정책을 다양한 곳에서 사용하고 있다. 하지만 이는 장점과 단점 모두 갖고있다. 복잡한 규칙을 사용하는 것이 효과적일까? 아니면 단순히 긴 길이의 비밀번호가 효과적일까?

sudoers를 통해 여러 다른 설정해보기

$> sudo visudo
#do something...

sudo 명령어의 비밀번호 입력 횟수 제한하기

Defaults	passwd=tries=num

sudo 명령어 사용 시 잘못된 비밀번호에 대한 경고 메세지 수정하기

Defaults	badpass_message="message"

sudo 명령어 사용 시 로그파일 만들기

Defaults	logfile="/var/log/sudo/sudo.log"
Defaults	log_input,log_output

sudo 명령어를 제한하는 경로 만들기

Defaults	secure_path="path"

보안을 위해 TTY모드 사용하기

Defaults	requiretty

모니터링 스크립트 만들기

cron이란?
: 소프트웨어 유틸리티 cron은 유닉스 계열 컴퓨터 운영 체제의 시간 기반 잡 스케줄러이다. 소프트웨어 환경을 설정하고 관리하는 사람들은 작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 스케줄링하기 위해 cron을 사용한다.
(/etc/crontab과 crontab -e 의 차이점: /etc/crontab은 명령을 실행할 계정을 지정할 수 있다. 하지만 빈번한 /etc/crontab의 수정은 시스템을 복잡하게 만들기 때문에 crontab -e 명령어를 사용하는걸 권장한다고 한다.)

참고자료

https://computingforgeeks.com/enforce-strong-user-password-policy-ubuntu-debian/
https://webdir.tistory.com/206
https://wiki.debianusers.or.kr/index.php?title=Sudo
http://programmingskills.net/archives/315
http://blog.naver.com/PostView.nhn?blogId=jgenius&logNo=220747854161&categoryNo=0&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=postView
https://www.tecmint.com/sudo-insult-when-enter-wrong-password/
https://hippogrammer.tistory.com/79
https://myshell.co.uk/blog/2012/07/how-to-determine-the-number-of-physical-cpus-on-linux/
https://withcoding.com/104
https://blueyikim.tistory.com/555
https://shaeod.tistory.com/623
https://faq.hostway.co.kr/Linux_ETC/3236
https://newstars.tistory.com/427
https://www.whatap.io/ko/blog/11/
https://stackoverflow.com/questions/22203120/cronjob-entry-in-crontab-e-vs-etc-crontab-which-one-is-better
https://velog.io/@hyeseong-dev/%EB%A6%AC%EB%88%85%EC%8A%A4-ssh%EB%9E%80
https://ko.wikipedia.org/wiki/UFW
https://www.lesstif.com/lpt/lsblk-106856724.html
https://askubuntu.com/questions/932392/whats-exactly-the-point-of-the-sudo-command-in-terms-of-security
https://securityboulevard.com/2020/04/the-benefits-and-drawbacks-of-password-complexity-rules/

profile
수신제가치국평천하

0개의 댓글