Cloud & Platform
Azure 가상 머신(VM) 생성 및 보안 설정 가이드
Azure 가상 머신(VM) 생성 및 보안 설정 가이드 학습 내용을 정리한 백필 노트입니다.
이 글은 2025년 학습 기록을 블로그 형식으로 정리한 백필 노트입니다.
1. Azure Linux VM 생성 및 웹 서버 구축
1.1. 가상 머신(VM) 생성
- 리소스 생성: Azure 포털 검색창에서 '가상 머신'을 검색하여 'Azure 가상 머신 만들기'를 선택합니다.
- 기본 설정:
- 리소스 그룹:
web-rg(새로 만들기) - 가상 머신 이름:
linux-vm - 이미지:
Ubuntu Server 24.04 LTS - x64 Gen2 - 크기:
Standard_D2s_v3(2 vcpu, 8 GiB 메모리)
- 리소스 그룹:
- 관리자 계정 설정:
- 인증 형식: SSH 공개 키
- 사용자 이름:
azureuser(보안상admin,root등은 사용 불가) - 키 쌍 이름:
linux-vm_key(새 키 쌍 생성)
- 인바운드 포트 규칙:
- 공용 인바운드 포트 허용:
HTTP (80),HTTPS (443),SSH (22)선택
- 공용 인바운드 포트 허용:
- 모니터링 설정:
- 부트 진단:
사용 안 함으로 설정하여 스토리지 비용을 절감하고 관리를 용이하게 합니다. - 부트 진단은 VM 부팅 문제 발생 시 콘솔 로그와 스크린샷을 저장하여 원인 분석을 돕는 기능입니다.
- 부트 진단:
- 생성 및 키 다운로드:
- 설정 검토 후 VM을 생성합니다.
- *'프라이빗 키 다운로드 및 리소스 만들기'**를 클릭하여 SSH 접속에 필요한
.pem키 파일을 다운로드하고 안전하게 보관합니다. 이 키 파일이 없으면 VM에 접속할 수 없으므로 매우 중요합니다.
💡 Just-In-Time(JIT) 액세스 정책이란?
평상시에는 SSH(22), RDP(3389) 같은 관리 포트를 닫아두고, 필요할 때만 일시적으로 접근을 허용하여 보안을 강화하는 기능입니다. 공격에 노출될 위험을 최소화하는 효과적인 클라우드 보안 기술입니다.
1.2. VM 접속 및 웹 서버 설치
-
SSH 접속:
- 배포가 완료되면 '리소스로 이동'하여 생성된 VM을 확인합니다.
- '연결' 메뉴에서 Azure CLI를 통한 SSH 접속 명령어를 확인하고, VM의 공인 IP 주소를 기록합니다.
-
관리자 권한 획득:Bash
sudo su -
패키지 업데이트:Bash
sudo apt update -y && sudo apt upgrade -y -
LAMP 서버 설치:Bash
sudo apt install lamp-server^ -y -
웹 서버 접속 확인:
- 웹 브라우저에서 기록해 둔 공인 IP 주소로 접속하여 Apache 기본 페이지가 나타나는지 확인합니다.
1.3. Apache 로그 분석
서버 운영, 보안, 문제 해결에 중요한 로그 파일은 Ubuntu/Debian 기준 /var/log/apache2/ 경로에 저장됩니다.
- 접근 로그 (
access.log):- 확인 명령어:
tail -n 10 /var/log/apache2/access.log - 로그 형식:
IP - - [시간] "요청방식 URL 프로토콜" 상태코드 응답크기 "이전페이지" "사용자 에이전트" - 예시 분석:
121.140.82.80IP가2025년 7월 7일에GET방식으로 루트(/) 페이지를 요청했고, 정상 응답(200)을 받음.
- 확인 명령어:
- 에러 로그 (
error.log):- 확인 명령어:
tail -n 10 /var/log/apache2/error.log - 로그 형식:
[시간] [모듈:심각도] [프로세스ID] 메시지 - 예시 분석: 아파치 서버가 정상적으로 설정되어 재시작되었음을 알리는 일반적인 알림 로그. 설정 오류나 문제 발생 시 이곳에 기록됩니다.
- 확인 명령어:
1.4. Linux VM 보안 설정
1.4.1. Fail2Ban: 무차별 대입 공격 방어
Fail2Ban은 로그 파일을 감시하여 반복적인 로그인 실패 등 의심스러운 IP를 자동으로 방화벽에서 차단하는 도구입니다.
-
설치:Bash
sudo apt install fail2ban -y -
설정 파일 복사:Bash
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local -
Apache 차단 규칙 활성화:Ini, TOML
sudo vi /etc/fail2ban/jail.local명령어로 설정 파일을 엽니다.[apache-badbots]섹션을 찾아 아래와 같이 수정하여 활성화합니다.
[apache-badbots] enabled = true port = http,https logpath = /var/log/apache2/*access.log bantime = 48h maxretry = 1 -
서비스 재시작 및 활성화:Bash
sudo systemctl restart fail2ban sudo systemctl enable fail2ban -
상태 확인:
sshd와apache-badbots규칙이 활성화되었는지 확인합니다.Bashsudo fail2ban-client status -
차단 테스트:
-
HTTP: 악성 봇으로 위장하여 1회 초과 접근 시 IP가 48시간 동안 차단됩니다.Bash
# 첫 번째 요청은 성공 curl -A "EmailCollector" http://<VM-공인-IP> # 두 번째 요청부터는 타임아웃 발생 (차단됨) curl -A "EmailCollector" http://<VM-공인-IP> -
SSH: 존재하지 않는 사용자로 5회 이상 접속 시도 시 해당 IP가 기본 10분간 차단됩니다.Bash
for i in {1..5}; do ssh -o ConnectTimeout=3 wronguser@<VM-공인-IP> "exit"; done # 이후 정상적인 계정으로도 접속 시 타임아웃 발생 (차단됨) ssh -i ./linux-vm_key.pem azureuser@<VM-공인-IP> -
차단 로그는
/var/log/fail2ban.log파일에서 확인할 수 있습니다.
-
💡 SSH 보안 강화 권장 사항
지정된 IP에서만 접근 허용, 기본 포트(22) 변경, 2단계 인증(2FA) 적용, 내부망을 통한 Bastion Host 활용 등이 더 안전한 방법입니다.
1.4.2. AppArmor: 애플리케이션 접근 제어
AppArmor는 리눅스 커널 보안 모듈(LSM)로, 각 애플리케이션이 접근할 수 있는 파일 및 권한을 프로필 기반으로 제한하여 시스템을 보호합니다. (Ubuntu 기본 활성화)
-
유틸리티 설치 및 활성화:Bash
apt install apparmor-utils -y systemctl enable apparmor systemctl start apparmor -
정책 위반 테스트 설정:Bash
- Apache가 시스템의 중요 파일(
/etc/passwd)을 읽도록 테스트용 PHP 파일을 생성합니다.
cat <<EOF > /var/www/html/index.php <?php echo file_get_contents('/etc/passwd'); ?> EOF rm -rf /var/www/html/index.html - Apache가 시스템의 중요 파일(
-
AppArmor 프로필 정의:Bash
/etc/apparmor.d/usr.sbin.apache2파일에 Apache가 접근할 수 있는 경로를 명시적으로 정의합니다./etc/passwd는 허용 목록에 없습니다.
cat <<EOF > /etc/apparmor.d/usr.sbin.apache2 #include <tunables/global> profile /usr/sbin/apache2 flags=(attach_disconnected) { #include <abstractions/base> /var/log/apache2/** rw, /var/www/** r, /etc/apache2/** r, /tmp/** rw, /usr/lib/apache2/** mr, /usr/sbin/apache2 mr, network inet stream, network inet6 stream, } EOF -
프로필 적용 및 상태 확인:Bash
apparmor_parser -r /etc/apparmor.d/usr.sbin.apache2 sudo aa-status -
결과 확인:
- 웹 브라우저로 접속 시, Apache는 허용되지 않은
/etc/passwd파일 접근을 시도하다 AppArmor 정책에 의해 차단(DENIED)됩니다. - 시스템 로그(
journalctl -k | grep DENIED)에서 차단 기록을 확인할 수 있습니다. - 이로 인해 Apache 서비스가 비정상 종료(
failed)될 수 있습니다. 정책을 다시 비활성화하려면R옵션을 사용합니다:sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.apache2
- 웹 브라우저로 접속 시, Apache는 허용되지 않은
2. Azure Windows VM 생성 및 웹 서버(IIS) 구축
2.1. 가상 머신(VM) 생성
- 리소스 생성: Azure 포털에서 'Azure 가상 머신 만들기'를 선택합니다.
- 기본 설정:
- 리소스 그룹:
web-rg(기존 그룹 사용) - 가상 머신 이름:
window-vm - 이미지:
Windows Server 2019 Datacenter - x64 Gen2 - 크기:
Standard_D2s_v3(2 vcpu, 8 GiB 메모리)
- 리소스 그룹:
- 관리자 계정:
- 사용자 이름:
azureuser - 암호:
Optional12!@(복잡성 요구 조건 충족 필요)
- 사용자 이름:
- 인바운드 포트 규칙:
- 공용 인바운드 포트 허용:
HTTP (80),HTTPS (443),RDP (3389)선택
- 공용 인바운드 포트 허용:
- 모니터링:
- 부트 진단:
사용 안 함으로 설정
- 부트 진단:
2.2. VM 접속 및 IIS 설치
-
RDP 접속:
- 배포 완료 후 '리소스로 이동'하여 '연결' 메뉴에서 RDP 파일 다운로드를 클릭합니다.
- 다운로드한
.rdp파일을 실행하고, 설정한 암호(Optional12!@)를 입력하여 원격 데스크톱으로 접속합니다.
-
IIS 설치:PowerShell
- 원격 접속 후, Windows 아이콘을 우클릭하여 **Windows PowerShell (Admin)**을 실행합니다.
- 아래 명령어를 실행하여 IIS 웹 서버를 설치하고 자동으로 시작되도록 설정합니다.
Install-WindowsFeature -name Web-Server -IncludeManagementTools Set-Service -name W3SVC -startupType Automatic -
웹 서버 접속 확인:
- Azure 포털에서
window-vm의 공인 IP 주소를 복사하여 웹 브라우저로 접속하면 IIS 기본 페이지가 나타납니다.
- Azure 포털에서
2.3. IIS 기능 설정 및 보안
2.3.1. 디렉터리 브라우징 설정 및 위험성
- IIS 관리자 실행: 시작 메뉴에서
inetmgr을 검색하여 실행합니다. - 기능 활성화:
window-vm > Directory Browsing으로 이동하여 'Enable'을 클릭합니다. - 테스트:
C:\inetpub\wwwroot경로에test폴더와 그 안에sample.txt파일을 생성합니다.- 웹 브라우저에서
http://<VM-공인-IP>/test/로 접속하면 폴더 내용이 노출됩니다. - 위험성: 이 기능이 활성화되면 서버의 파일 및 폴더 구조가 외부에 노출되어 중요 정보 유출이나 추가 공격의 빌미가 될 수 있습니다.
2.3.2. IIS 인증 및 접근 제어
- Windows 인증 기능 설치:
- '서버 관리자' 또는 '제어판 > 프로그램 기능 켜기/끄기'에서 '역할 및 기능 추가 마법사'를 실행합니다.
웹 서버(IIS) > 보안섹션에서 **'Windows 인증'**을 선택하고 설치합니다.
- 인증 설정:
- IIS 관리자에서
Default Web Site > 인증으로 이동합니다. - Anonymous Authentication (익명 인증)을
Disabled로 변경합니다. - Windows Authentication (Windows 인증)을
Enabled로 변경합니다.
- IIS 관리자에서
- 결과 확인:
- 이제 웹사이트에 접속하면 인증 창이 나타나며, VM 생성 시 설정한 계정(
azureuser/Optional12!@)으로만 접근이 가능합니다.
- 이제 웹사이트에 접속하면 인증 창이 나타나며, VM 생성 시 설정한 계정(
2.3.3. 폴더별 개별 인증 설정
/test폴더에 대해 익명 접근을 허용하도록 설정을 변경합니다.- IIS 관리자에서
Default Web Site > test폴더를 선택하고 '인증'으로 이동합니다. - Windows Authentication:
Disable - Anonymous Authentication:
Enable - 이제 루트 경로는 인증이 필요하지만,
/test경로는 누구나 접근할 수 있습니다.
- IIS 관리자에서
2.3.4. 별도 사용자 생성 및 폴더 권한 부여
- 사용자 생성: '컴퓨터 관리 > 로컬 사용자 및 그룹'에서
test라는 새 사용자를 생성합니다. (암호:Optional12!@) - 폴더 권한 설정:
C:\inetpub\wwwroot\test폴더의 속성 > 보안 탭에서 '편집'을 클릭합니다.- '추가' 버튼을 눌러
test사용자를 추가하고 모든 권한(Allow)을 부여합니다. - 기존
Administrators그룹의 권한을 'Deny'로 설정하여 접근을 제한합니다.
- 결과 확인: 이제
/test경로는test사용자 계정으로만 접근이 가능합니다.
2.4. 엔드포인트 보호 (Windows Defender)
Windows Server에는 기본적으로 엔드포인트 보호 솔루션인 Windows Defender가 내장되어 있어 실시간으로 악성코드를 탐지하고 차단합니다.
-
활성화 상태 확인: PowerShell에서 아래 명령어를 실행하여
AMServiceEnabled가True인지 확인합니다.PowerShellGet-MpComputerStatus -
탐지 테스트:
-
메모장을 열어 EICAR 테스트 문자열을 입력하고 저장합니다.
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* -
파일 저장 즉시 Windows Defender가 이를 악성코드로 탐지하여 자동으로 제거합니다.
-
'Windows 보안 > 바이러스 및 위협 방지'에서 탐지 기록을 확인할 수 있습니다.
-
2.5. IPBan: 자동 IP 차단 솔루션
IPBan은 로그인 실패가 반복되는 IP를 Windows 방화벽에서 자동으로 차단하는 오픈소스 프로그램입니다.
-
설치: PowerShell(관리자)에서 아래 명령어를 순차적으로 실행합니다.PowerShell
# 폴더 생성 $dest = "C:\\IPBan" New-Item -ItemType Directory -Force -Path $dest # 다운로드 Invoke-WebRequest -Uri "https://github.com/DigitalRuby/IPBan/releases/download/3.0.0/IPBan-Windows-x64_3_0_0.zip" -OutFile "$dest\\IPBan-Windows-x64_3_0_0.zip" # 압축 해제 Expand-Archive -Path "$dest\\IPBan-Windows-x64_3_0_0.zip" -DestinationPath $dest -Force -
서비스 등록 및 시작:PowerShell
# 서비스 등록 sc.exe create IPBAN type= own start= delayed-auto binPath= "$dest\\DigitalRuby.IPBan.exe" DisplayName= IPBAN # 서비스 시작 sc.exe start IPBAN -
동작 확인:
- IPBan은 RDP, IIS 등 다양한 서비스 로그를 감시하여 임계값 초과 시 해당 IP의 모든 접근을 차단합니다.
- 외부에서
curl http://<VM-공인-IP>와 같은 명령을 반복 실행하면 정책 위반으로 해당 IP가 차단되어 RDP 및 웹 접속이 모두 불가능해집니다. - 로그는
C:\IPBan폴더에서 확인할 수 있습니다.