웹사이트 검색

Ubuntu 20.04/18.04 및 16.04를 사용한 초기 서버 설정


이 튜토리얼에서는 서버의 보안과 안정성을 높이기 위해 새로 설치된 Ubuntu 서버에서 구성해야 하는 첫 번째 기본 단계를 안내합니다.

이 주제에 설명된 구성은 기본 OS 플랫폼과 관련하여 Ubuntu가 베어 메탈 서버, 개인 가상 머신 또는 가상 머신에 설치되어 있는지 여부에 관계없이 모든 Ubuntu 서버 시스템에서 거의 동일합니다. VPS 퍼블릭 클라우드에서 분리되었습니다.

요구사항

  • 우분투 20.04 서버 설치
  • 우분투 18.04 서버 설치
  • 우분투 16.04 서버 설치

Ubuntu 시스템 업데이트 및 업그레이드

Ubuntu 서버를 새로 설치하거나 새로 배포된 Ubuntu VPS의 경우 처리해야 할 첫 번째 단계는 시스템과 다음과 같은 모든 시스템 구성 요소를 확인하는 것입니다. 커널, 적절한 패키지 관리자 및 기타 설치된 모든 패키지는 최신 릴리스 버전과 보안 패치로 최신 상태입니다.

Ubuntu 서버를 업데이트하려면 루트 권한이 있는 계정으로 서버 콘솔에 로그인하거나 루트로 직접 로그인하고 아래 명령을 실행하여 업데이트 및 업그레이드 프로세스를 수행합니다.

sudo apt update 

업데이트 명령을 실행하면 업그레이드 프로세스에 사용 가능한 패키지 수와 패키지 업그레이드 목록을 나열하는 데 사용되는 명령이 표시됩니다.

sudo apt list --upgradable

업그레이드 가능한 패키지 목록을 확인한 후 아래 명령을 실행하여 시스템 업그레이드 프로세스를 시작하세요.

sudo apt upgrade

로컬로 다운로드한 모든 deb 패키지와 기타 모든 apt-get 캐시를 제거하려면 아래 명령을 실행하십시오.

sudo apt autoremove
sudo apt clean

우분투에서 새 계정 만들기

기본적으로 보안 조치로 Ubuntu에서는 루트 계정이 완전히 비활성화되어 있습니다. 시스템에 새 계정을 생성하려면 루트 권한이 있는 계정 사용자로 시스템에 로그인한 후 아래 명령을 사용하여 새 계정을 생성합니다.

이 새 계정은 sudo 명령을 통해 루트 권한이 부여되며 시스템에서 관리 작업을 수행하는 데 사용됩니다. 이 계정을 보호하려면 강력한 비밀번호를 설정하세요. adduser 프롬프트에 따라 사용자 세부정보와 비밀번호를 설정하세요.

sudo adduser ubuntu_user

이 계정이 다른 시스템 관리자에게 할당되는 경우 다음 명령을 실행하여 사용자가 첫 번째 로그인 시도 시 비밀번호를 변경하도록 강제할 수 있습니다.

sudo chage -d0 ubuntu_user

현재 새로 추가된 사용자는 sudo 유틸리티를 통해 관리 작업을 수행할 수 없습니다. 이 새 사용자 계정에 관리 권한을 부여하려면 아래 명령을 실행하여 사용자를 “sudo” 시스템 그룹에 추가해야 합니다.

sudo usermod -a -G sudo ubuntu_user

기본적으로 "sudo" 그룹에 속한 모든 사용자는 sudo 유틸리티를 통해 루트 권한으로 명령을 실행할 수 있습니다. 아래 예시와 같이 실행에 필요한 명령어를 작성하기 전에 반드시 Sudo 명령어를 사용해야 합니다.

sudo apt install package_name

시스템에 로그인하고 sudo라는 접두어가 붙은 apt update 명령을 실행하여 새 사용자에게 루트 권한이 부여되었는지 테스트합니다.

su - ubuntu_user
sudo apt update

Ubuntu에서 시스템 호스트 이름 구성

일반적으로 시스템 호스트 이름은 시스템 설치 프로세스 중에 또는 VPS가 클라우드에 생성될 때 설정됩니다. 그러나 서버의 대상을 더 잘 반영하거나 서버의 최종 목적을 더 잘 설명하려면 시스템 이름을 변경해야 합니다.

대기업에서는 데이터센터 랙에 있는 머신을 쉽게 식별할 수 있도록 복잡한 명명 체계에 따라 머신 이름을 지정합니다. 예를 들어, Ubuntu 시스템이 메일 서버를 작동하는 경우 시스템 이름은 이 사실을 반영해야 하며 예를 들어 시스템 호스트 이름을 mx01.mydomain.lan으로 설정할 수 있습니다.

컴퓨터 호스트 이름에 대한 세부 정보를 표시하려면 다음 명령을 실행하세요.

hostnamectl

컴퓨터의 이름을 변경하려면 아래 발췌에 설명된 대로 컴퓨터에 대해 구성할 새 이름으로 hostnamectl 명령을 실행하세요.

sudo hostnamectl set-hostname tecmint

아래 명령 중 하나를 사용하여 시스템의 새 이름을 확인하십시오.

hostname
hostname -s
cat /etc/hostname 

Ubuntu에서 공개 키 인증을 사용하여 SSH 설정

Ubuntu 서버의 시스템 보안 수준을 높이려면 로컬 계정에 대해 SSH 공개 키 인증을 설정해야 합니다. 2048비트와 같은 키 길이를 지정하여 공개 키와 개인 키인 SSH 키 쌍을 생성하려면 서버 콘솔에서 다음 명령을 실행하세요.

SSH 키를 설정하는 사용자로 시스템에 로그인했는지 확인하세요.

su - ubuntu_user
ssh-keygen -t RSA -b 2048

키가 생성되는 동안 키를 보호하기 위해 암호를 추가하라는 메시지가 표시됩니다. 강력한 암호를 입력하거나 SSH 서버를 통해 작업을 자동화하려는 경우 암호를 비워 두도록 선택할 수 있습니다.

SSH 키가 생성된 후 아래 명령을 실행하여 공개 키를 원격 서버에 복사할 수 있습니다. 원격 SSH 서버에 공개 키를 설치하려면 원격 서버에 로그인하기 위한 적절한 권한과 자격 증명이 있는 원격 사용자 계정이 필요합니다.

ssh-copy-id remote_user@remote_server

공개 키 인증 방법을 사용하면 SSH를 통해 원격 서버에 자동으로 로그인할 수 있어야 합니다. SSH 공개 키 인증을 사용하는 동안에는 원격 사용자 비밀번호를 추가할 필요가 없습니다.

원격 서버에 로그인한 후 아래 스크린샷과 같이 w 명령과 같은 명령을 실행하여 SSH 원격으로 로그인한 사용자를 나열할 수 있습니다.

원격 SSH 세션을 닫으려면 콘솔에 종료를 입력하세요.

ssh remote_user@remote_server
w
exit

원격 SSH 서버에 키를 수동으로 설치하기 위해 공개 SSH 키의 내용을 보려면 다음 명령을 실행하십시오.

cat ~/.ssh/id_rsa.pub

Ubuntu의 보안 SSH 서버

SSH 데몬을 보호하려면 기본 SSH 포트 번호를 22에서 1024보다 높은 임의의 포트로 변경하고 다음을 통한 루트 계정에 대한 원격 SSH 액세스를 허용하지 않아야 합니다. 비밀번호 또는 키를 SSH 서버 기본 구성 파일을 열고 다음과 같이 변경합니다.

sudo vi /etc/ssh/sshd_config

먼저, 주석 처리된 행 #Port22을 검색하고 아래에 새 행을 추가합니다(리스닝 포트 번호를 그에 따라 교체).

Port 2345

파일을 닫지 말고 아래로 스크롤하여 #PermitRootLogin yes 줄을 검색하고 줄 시작 부분에서 # 기호(해시태그)를 제거하여 줄의 주석 처리를 해제한 다음 아래 발췌문에 표시된 것처럼 줄을 수정하십시오.

PermitRootLogin no

그런 다음 SSH 서버를 다시 시작하여 새 설정을 적용하고 새 포트 번호를 통해 루트 계정으로 원격 시스템에서 이 서버에 로그인을 시도하여 구성을 테스트합니다. SSH를 통한 루트 계정 접근은 제한되어야 합니다.

sudo systemctl restart sshd

또한 SSH 서버의 새 수신 포트 번호를 표시하려면 netstat 또는 ss 명령을 실행하고 grep 명령을 통해 출력을 필터링하세요.

sudo ss -tlpn| grep ssh
sudo netstat -tlpn| grep ssh

일정 기간 동안 활동이 없으면 서버에 설정된 모든 원격 SSH 연결을 자동으로 연결 해제하려는 상황이 있습니다.

이 기능을 활성화하려면 아래 명령을 실행하십시오. 그러면 TMOUT bash 변수가 계정 .bashrc 숨김 파일에 추가되고 해당 이름으로 이루어진 모든 SSH 연결이 강제 실행됩니다. 사용자가 5분 동안 활동이 없으면 연결이 끊어지거나 삭제됩니다.

echo 'TMOUT=300' >> .bashrc

tail 명령을 실행하여 .bashrc 파일 끝에 변수가 올바르게 추가되었는지 확인하세요. 이후의 모든 SSH 연결은 지금부터 5분 동안 활동이 없으면 자동으로 닫힙니다.

tail .bashrc

아래 스크린샷에서는 ubuntu_user 계정을 통해 drupal 시스템에서 Ubuntu 서버로의 원격 SSH 세션이 시간 초과되어 5분 후에 자동 로그아웃되었습니다.

Ubuntu 방화벽 UFW 구성

네트워크 수준에서 시스템을 보호하려면 모든 서버에 잘 구성된 방화벽이 필요합니다. Ubuntu 서버는 UFW 애플리케이션을 사용하여 서버의 iptables 규칙을 관리합니다.

아래 명령을 실행하여 Ubuntu에서 UFW 방화벽 응용 프로그램의 상태를 확인하십시오.

sudo systemctl status ufw
sudo ufw status

일반적으로 UFW 방화벽 데몬은 Ubuntu 서버에서 실행되지만 규칙은 기본적으로 적용되지 않습니다. 시스템에서 UFW 방화벽 정책을 활성화하기 전에 먼저 SSH 트래픽이 변경된 SSH 포트를 통해 방화벽을 통과하도록 허용하는 새 규칙을 추가해야 합니다. 아래 명령을 실행하여 규칙을 추가할 수 있습니다.

sudo ufw allow 2345/tcp

SSH 트래픽을 허용한 후 다음 명령을 사용하여 UFW 방화벽 응용 프로그램을 활성화하고 확인할 수 있습니다.

sudo ufw enable
sudo ufw status

HTTP 서버, 메일 서버 또는 기타 네트워크 서비스와 같이 서버에 이후에 설치되는 다른 네트워크 서비스에 대한 새 방화벽 규칙을 추가하려면 아래 방화벽 명령 예를 가이드로 사용하십시오.

sudo ufw allow http  #allow http traffic
sudo ufw allow proto tcp from any to any port 25,443  # allow https and smtp traffic

모든 방화벽 규칙을 나열하려면 아래 명령을 실행하십시오.

sudo ufw status verbose

Ubuntu 서버 시간 설정

Ubuntu 서버 시계 및 기타 관련 시간 설정을 제어하거나 쿼리하려면 인수 없이 timedatectl 명령을 실행하세요.

서버의 시간대 설정을 변경하려면 먼저 list-timezones 인수와 함께 timedatectl 명령을 실행하여 사용 가능한 모든 시간대를 나열한 다음 아래 발췌에 표시된 대로 시스템의 시간대를 설정하세요.

sudo timedatectl 
sudo timedatectl list-timezones 
sudo timedatectl set-timezone Europe/Vienna

새로운 systemd-timesyncd systemd 데몬 클라이언트는 네트워크 전체에서 서버에 정확한 시간을 제공하고 상위 시간 피어 서버와 시간을 동기화하기 위해 Ubuntu에서 활용될 수 있습니다.

Systemd의 이 새로운 기능을 적용하려면 아래 파일 발췌에 표시된 대로 systemd-timesyncd 데몬 구성 파일을 수정하고 지리적으로 가장 가까운 NTP 서버를 NTP 문 줄에 추가하세요.

sudo nano /etc/systemd/timesyncd.conf

timesyncd.conf 파일에 다음 구성을 추가합니다.

[Time]
NTP=0.pool.ntp.org 1.pool.ntp.org
FallbackNTP=ntp.ubuntu.com

지리적으로 가장 가까운 NTP 서버를 추가하려면 다음 주소에서 NTP 풀 프로젝트 서버 목록을 참조하세요: http://www.pool.ntp.org/en/

그런 다음 Systemd timesync 데몬을 다시 시작하여 변경 사항을 반영하고 아래 명령을 실행하여 데몬 상태를 확인하세요. 다시 시작한 후 데몬은 새 ntp 서버 피어와 시간을 동기화하기 시작합니다.

sudo systemctl restart systemd-timesyncd.service 
sudo systemctl status systemd-timesyncd.service

Ubuntu에서 불필요한 서비스 비활성화 및 제거

Ubuntu 서버에서 기본적으로 실행 중인 모든 TCP 및 UDP 네트워크 서비스 목록을 얻으려면 ss 또는 netstat 명령을 실행하세요.

sudo netstat -tulpn
OR
sudo ss -tulpn

Ubuntu 16.10 릴리스부터 기본 DNS 확인자는 이제 netstat 또는 의 출력에 표시된 대로 systemd-resolved 서비스에 의해 제어됩니다. >ss 명령.

또한 다음 명령을 실행하여 systemd-resolved 서비스 상태를 확인해야 합니다.

sudo systemctl status systemd-resolved.service

systemd-resolved 서비스는 활성화된 모든 네트워크 인터페이스에 바인딩되고 포트 53, 5355 TCPUDP에서 수신 대기합니다.

프로덕션 서버에서 시스템 확인 캐싱 DNS 데몬을 실행하는 것은 악의적인 해커가 보안되지 않은 DNS 서버에 대해 수행하는 수많은 DDOS 공격으로 인해 위험할 수 있습니다.

이 서비스를 중지하고 비활성화하려면 다음 명령을 실행하십시오.

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

ss 또는 netstat 명령을 실행하여 서비스가 중지 및 비활성화되었는지 확인합니다. systemd에서 확인된 수신 포트인 53 및 5355 TCP 및 UDP는 아래 그림과 같이 netstat 또는 ss 명령 출력에 나열되어서는 안 됩니다.

또한 모든 systemd-resolved 데몬 서비스를 완전히 비활성화하고 기본 /etc/resolv.conf 파일을 복원하려면 시스템을 재부팅해야 합니다.

sudo ss -tulpn
sudo netstat -tulpn
sudo systemctl reboot

서버에서 실행되지 않는 일부 원치 않는 네트워킹 서비스를 비활성화했지만 lxc 프로세스 및 snapd 서비스와 같은 다른 서비스도 시스템에 설치되어 실행되고 있습니다. 이러한 서비스는 ps, top 또는 pstree 명령을 통해 쉽게 감지할 수 있습니다.

sudo ps aux
sudo top
sudo pstree

서버에서 LXC 컨테이너 가상화를 사용하지 않거나 Snap 패키지 관리자를 통해 패키지된 소프트웨어 설치를 시작하지 않을 경우 아래 명령을 실행하여 이러한 서비스를 완전히 비활성화하고 제거해야 합니다.

sudo apt autoremove --purge lxc-common lxcfs
sudo apt autoremove --purge snapd

그게 다야! 이제 Ubuntu 서버는 웹 서버, 데이터베이스 서버, 파일 공유 서비스 또는 기타 특정 응용 프로그램 설치 및 구성과 같은 사용자 정의 네트워크 서비스 또는 응용 프로그램에 필요한 추가 소프트웨어를 설치할 준비가 되었습니다.