Network Security

NSG(Network Security Group)

- 가상 네트워크 트래픽 제한

- 서브넷 또는 네트워크 인터페이스에 연결

- 보안 규칙을 사용하여 네트워크 트래픽 allow 또는 deny

- subnet과 NIC 둘 다에 NSG 설정 시, 두 수준 모두에 allow 규칙이 있어야 트래픽이 허용됨(subnet 및 NIC에 대해 독립적으로 평가됨)

 

Load Balancing

ASG(Application Security Groups)

- 가상 머신(웹 서버, 애플리케이션 서버)을 논리적으로 그룹화

- 트래픽 흐름을 제어하는 규칙 정의

- 보안을 강화하기 위해 ASG를 NSG로 포장

 

Service Endpoint

- VNet(가상 네트워크) Service Endpoint는 Azure 백본 네트워크에서 최적화된 경로를 통해 Azure 서비스에 대한 안전한 직접 연결을 제공한다. 

- Service Endpoint를 사용하면 가상 네트워크에 대해 중요한 Azure 서비스 리소스를 보호할 수 있다. 

- VNet에 public IP 주소가 없어도 private IP 주소를 통해 Azure Service Endpoint에 연결할 수 있다.

service endpoint


실습) NSG, ASG
조직에는 두 개의 서버 그룹이 있다. 웹 서버 및 관리 서버. 각 서버 그룹은 자체 ASG에 있어야 한다.
관리 서버로 RDP를 전송할 수 있어야 하고, 웹 서버는 인터넷에서 액세스할 때 IIS 웹 페이지를 표시해야 한다.
또한 트래픽이 올바르게 라우팅되도록 하려면 NSG를 만들어야 한다.

실습 구성도
NSG

가상 네트워크 myVirtualNetwork를 만들고, mySubnet이라는 서브넷을 만든 후

myNSG라는 네트워크 보안 그룹을 생성하여 이 서브넷에 연결시킨다.

 

Inbound 규칙 추가

myNSG에 Inbound 규칙을 추가한다.

myAsgWebServers ASG에는 80,443 포트로 들어오는 것을 허용하고 (웹)

myAsgMgmtServers ASG에는 3389 포트로 들어오는 것을 허용한다. (원격 접속)

myVmMgmt

myVmMgmt 로 원격 접속을 한 후, 여기서 myVmWeb에 원격 접속을 한다.

myVmMgmt는 원격 접속 포트를 허용해줬기 때문에 외부에서 들어올 수 있지만,  myVmWeb은 허용하지 않았기 때문에 외부에서 곧바로 접속이 불가능하기 때문이다.

외부에서 접속

myVmWeb에서 powershell 명령어를 통해 웹 서버를 설치하고

(Install-WindowsFeature -name Web-Server -IncludeManagementTools)

public IP를 확인한 후, 접속해본다. 80,443번 포트로 들어오는 것을 허용해놨기 때문에 접속에 성공할 수 있다. 


Host Security(Server)

Endpoint Protection

- Endpoint System : 사용자와 직접 상호 작용하는 컴퓨터 시스템

- 엔드포인트를 보호하기 위해서 맬웨어 방지 솔루션 설치. Cloud와 통합하여 상태를 모니터링할 수도 있다.

Virtual Machine Templates
- Resource Manager Templates를 사용하여 VM을 정의한다. 
이를 사용하면 VM을 쉽게 배포 그리고 다시 배포할 수 있다. 새로 업데이트되어 보안이 강화된 OS를 강제로 배포하려는 경우 VM을 주기적으로 다시 배포하는 것이 좋은데, 템플릿을 사용하면 쉽게 배포가 가능하다.

Remote Access Management
- Windows 기반 가상 시스템을 위한 RDP(원격 데스크톱 프로토콜)
- Linux 기반 가상 시스템을 위한 SSH(Secure Shell Protocol)
- SSL을 통한 포털을 통한 RDP/SSH의 기반 서브넷

Update Management
- 전반적으로 업데이트 상태를 평가하고 on-premise 및 Azure 환경에 대해 Windows 서버 및 Linux 서버 업데이트를 관리할 수 있다.

Disk Encryption
- 운영 체제 및 데이터 디스크를 암호화하여 제공할 수 있다.
- Windows는 BitLocker, Linux는 DM-Crypt 이용
- Azure Key Vault와 통합되어 디스크 암호화 키 및 비밀을 제어 및 관리할 수 있다. 


Container Security

ACI(Azure Container Instance)
: 간단한 애플리케이션, 작업 자동화 및 빌드 작업 등 컨테이너에서 작동하는 시나리오용 PaaS 서비스
- 빠른 시작 시간(Azure에서 몇 초만에 컨테이너를 시작할 수 있음) / Public IP 와 DNS로 컨테이너 액세스 가능 / 애플리케이션이 VM에 있는 것처럼 컨테이너에서 격리되도록 보장

 

※ 1. 도커 호스트가 vm 인 경우 docker를 설치하고 로그인을 한 후에 image를 Azure Container Registry에 있는 걸 다운
※ 2. 도커 호스트가 Azure Container Instance인 경우에 docker를 설치하지 않고 Azure Conatainer Registry 에 있는 걸 바로 다운받아 서비스 할 수 있음
(ACI가 좋은 이유는 Public IP가 컨테이너마다 부여되고, docker를 따로 안깔아도 된다는 점)

ACR(Azure Container Registry)
: 컨테이너 이미지를 저장하고 배포하는 서비스
- Azure CLI 또는 표준 docker login 명령을 사용하여 레지스트리에 로그인 >  Azure Container Registry는 HTTPS를 통해 컨테이너 이미지를 전송하고 TLS를 지원하여 클라이언트 연결을 보호
- RBAC(역할기반 액세스 컨트롤) 을 사용하여 사용자 또는 시스템에 세분화된 권한을 레지스트리에 할당할 수 있음

 

AKS(Azure Kubuernetes Service)
컨테이너 기반 애플리케이션 배포 및 관리를 간소화하는 서비스


실습) ACR과 AKS 구성하기 & 보안 활동
1. Dockerfile을 사용하여 이미지를 빌드
2. Azure Container Registry를 사용하여 이미지 저장
3. Azure Kubernetes 서비스를 구성
4. 내부 및 외부 모두에서 컨테이너 애플리케이션을 보호하고 액세스

먼저, 환경 구성

New-Item -Path "C:\" -Name "LabFiles" -ItemType "directory"

Start-BitsTransfer -Source 'https://github.com/MicrosoftLearning/AZ500-AzureSecurityTechnologies/archive/master.zip' -Destination C:\LabFiles

Expand-Archive -Path 'C:\LabFiles\master.zip' -DestinationPath 'C:\LabFiles'

Move-item -Path "C:\LabFiles\AZ500-AzureSecurityTechnologies-master\AllFiles\Labs\09*" -Destination "C:\LabFiles" -confirm:$false

실습 구성도

  • Task 1: Create an Azure Container Registry
az group list --query "[?name=='AZ500LAB09']" -o table
az acr create --resource-group AZ500LAB09 --name az500$RANDOM$RANDOM --sku Basic
az acr list --resource-group AZ500LAB09

Azure Cloudshell (bash)를 이용해

image를 저장할 Azure Container Regisrty를 생성한다.

  • Task 2: Create a Dockerfile, build a container and push it to Azure Container Registry
echo FROM nginx > Dockerfile
ACRNAME=$(az acr list --resource-group AZ500LAB09 --query '[].{Name:name}' --output tsv)
az acr build --image sample/nginx:v1 --registry $ACRNAME --file Dockerfile .

nginx 이미지를 담고있는 Dockerfile을 이용해 컨테이너를 생성하고, Task1에서 만들었던 ACR에 넣어준다.

 

  • Task 3: Create an Azure Kubernetes Service

Kubernetes Service를 하나 생성하고 배포된 것을 확인한다.

 

  • Task 4: Give AKS permission to access the ACR

이전에 생성한 Azure Container Registry 인스턴스를 사용하도록 AKS 클러스터를 구성한다.

 

  • Task 5: Deploy an external facing container from ACR to AKS

처음에 받아뒀던 파일을 cloudshell 업로드/다운로드 기능을 활용하여 업로드한다.
yaml 파일 24번째 줄에서 내가 만든 ACR 이름으로 바꿔줘야 한다.

 

  • Task 6: Verify you can access the container externally

 

  • Task 7: Deploy an internal facing container from ACR to AKS

external yaml 파일과 똑같이 24번째 줄에서 수정을 하고

 

  • Task 8: Verify you can access the container internally

external pod에서 internal pod가 동작중인지 확인해본다.


실습 2) Azure Kubernetes Service 이용
이 때 image는 Azure Container Registry에 저장된 것을 사용

① Resouce Group 생성
② ACR를 GUI로 생성하세요
ACR 서버 : yerimcr.azurecr.io
ACR Username : yerimcr
Password : Kv1=A1A60MDBp5kSRI7m6GLP/qu5JMaY

③ CentOS VM을 하나 생성하여 docker를 설치합니다.
yum install epel-release -y
yum update -y
vi /etc/sysconfig/selinux --> selinux=disabled로 수정
reboot
curl -sSL http://get.docker.com | bash
systemctl start docker

④ nginx, jesuswithme/verify-pod를 다운로드하여 nginx는 내용을 수정하세요
docker pull nginx
docker pull jesuswithme/verify-pod
docker run -d --name testing -p 80:80 nginx
docker exec -it testing /bin/bash
/# find -name "index.html" >> index.html 수정하기 위해 위치를 찾고
/# echo "Hello" > ./usr/share/nginx/html/index.html
/# exit
(VM으로 만든 컨테이너는 http://VM의publicIP:컨테이너포트번호로 확인한다)

⑤ ACR에 맞는 tag를 넣어서 이미지를 생성합니다.
docker tag 이미지 ACR서버/ACR에저장할이미지이름:태그명
docker commit 컨테이너ID ACR서버/ACR에저장할이미지이름:태그명
(docker images 하면 확인가능)

⑥ VM에서 ACR에 Image를 업로드합니다
docker login ACR서버 -u ACRusername
docker push ACR서버/이미지이름:태그명
(이제 ACR에서 올라간 이미지 확인 가능!!)

⑦ ACI에서 Container를 실행합니다
생성 중간에 Azure Container Registry 선택 후 여기에 업로드 한 이미지로 생성
생긴 Container의 Public IP로 접속

⑧ AKS를 구성합니다.

⑨ AKS에서 Deployment와 Service를 생성하여 Pod에 접속하게 합니다. 
yaml파일을 이용하려면 VM에서 다운로드하여 사용하세요
(vm) curl -sSL http://down.cloudshell.kr/down/k8slab.sh | bash
(vm) ls -l
(vm) cd k8s
(vm) cat 명령어로 deployment 대한 yaml 파일 확인하고 복사

AKS에서 deployment를 생성(복사한 yaml파일 활용)

(Cloudshell-Bash) az aks get-credentials -g yerimRG -n yrkube
(Cloudshell-Bash) kubectl get deployment -o wide
(Cloudshell-Bash) kubectl expose deployment app-deploy  --port=80 --type=LoadBalancer
(Cloudshell-Bash) kubectl get svc -o wide >>서비스 Public IP로 접속

'Study > Cloud' 카테고리의 다른 글

AZ500 (Azure Firewall 구현)  (0) 2022.08.18
AZ500 (Implement Platform Protection)  (0) 2022.08.18
AZ500 (Hybrid Identity)  (0) 2022.08.18
AZ500 (Identity and Access)  (0) 2022.08.17
AZ104 (NAT)  (0) 2022.08.12

- Compare Containers to VM

VM은 상대적으로 컨테이너에 비해 무겁다

컨테이너는 배포가 훨씬 빠르다

Fault tolerance : 하나 죽어도 된다

- Container 장점

Paas Service : 다운만 받으면 된다

PIP와 DNS 이름이 할당된다

Startup 시간이 빠르다

분리 가능

CPU 몇개, 메모리 몇개 구성 수정이 가능하다

VNet 연결이 가능하다

- Container Group

컨테이너 실행

- Docker Platform

기본적으로 도커를 사용


Kubernetes

- node는 VM

 

- AKS Networking

서비스 그룹은 Pod을 여러개 구성한 것

 

- AKS Storage

pod에 대한 볼륨을 node의 바깥 (Azure Files, Azure managed disk)으로 지정하여 데이터를 보호해야 한다

 

- AKS Scaling
Worker Node를 자동으로 늘려줌(Autoscaler)


실습 ) Azure에서 Docker 사용하기

실습 구성도

절차는 아래와 같다.

 

  1.  Azure 컨테이너 인스턴스를 사용하여 도커 이미지 배포
  2.  Azure 컨테이너 인스턴스의 기능 검토

Task 1 : Azure 컨테이너 인스턴스를 사용하여 도커 이미지 배포

URL 복사 


Task 2 : Azure 컨테이너 인스턴스의 기능 검토

컨테이너의 주소로 접속한다. 로그에서도 이를 확인할 수 있다. 

 


실습 ) Azure Kubernetes 사용하기

실습 구성도

Azure 컨테이너 인스턴스를 사용하여 실행하기에 적합하지 않은 다수의 다중 계층 응용 프로그램이 있다고 가정한다.

따라서 컨테이너 오케스트레이터인 Kubernetes를 사용하고, 관리 오버헤드를 최소화하기 위해 Azure Kubernetes Service의 단순화된 구현 환경 및 확장 기능을 테스트해본다.

절차는 아래와 같다.


  1.  Azure Kubernetes 서비스 클러스터 배포
  2.  Azure Kubernetes 서비스 클러스터에 Pod 배포
  3.  Azure Kubernetes 서비스 클러스터에서 컨테이너형 워크로드 확장

Task 1 : Azure Kubernetes 서비스 클러스터 배포 & Task 2 : Azure Kubernetes 서비스 클러스터에 Pod 배포

 


Task 3 : Azure Kubernetes 서비스 클러스터에서 컨테이너형 워크로드 확장


+) 모든 리소스 삭제

az group list --query "[?starts_with(name,'az104-09c')].name" --output tsv
az group list --query "[?starts_with(name,'az104-09c')].[name]" --output tsv | xargs -L1 bash -c 'az group delete --name $0 --no-wait --yes'

'Study > Cloud' 카테고리의 다른 글

AZ500 (Identity and Access)  (0) 2022.08.17
AZ104 (NAT)  (0) 2022.08.12
AZ104 (App Services)  (0) 2022.08.12
AZ104 (Virtual Machine Management)  (0) 2022.08.12
AZ104 (Azure Storage)  (0) 2022.08.10

+ Recent posts