본문 바로가기
Cloud

[CSAP] K8S Node Init Script

by VENUSIM 2024. 12. 27.

K8S Node 들의 CSAP 인증 대응을 위한 Init Script 생성 & 관리

Node 가 생성 될 때 Init Script 를 Node가 돌리는 구조가 아니라, DaemonSet 을 생성하면서 Script 가 도는 구조

GPU Node 들의 경우 Tolerance 넣어줘야된다

Docs

https://guide-gov.ncloud-docs.com/docs/k8s-k8suse-init-script

 

InitScript 설정

 

guide-gov.ncloud-docs.com

 

DaemonSet 설치

# 수도권
$ kubectl --kubeconfig=$KUBE_CONFIG apply -f https://raw.githubusercontent.com/NaverCloudPlatform/nks-examples/main/examples/initscript/gov/kr.yml

# 남부권
$ kubectl --kubeconfig=$KUBE_CONFIG apply -f https://raw.githubusercontent.com/NaverCloudPlatform/nks-examples/main/examples/initscript/gov/krs.yml

 

InitScript 생성

#!/bin/bash

# change-passwd.sh

echo "Password Init"
echo -e 'password' | passwd root

 

Init Script Daemonset 에 환경변수 추가

INIT SCRIPT SH 를 BASE64 Encode 해서 STARTUP_SCRIPT env 에 넣는다

$ kubectl --kubeconfig=$KUBE_CONFIG set env daemonset/init-script -n kube-system STARTUP_SCRIPT=$(base64 change-passwd.sh -w 0)

 

Init Script 가 잘 안돈다.

 

Init Script 돌아가는 UNIX ID 와 PWD 확인

#!/bin/bash

# change-passwd.sh

echo "Password Init"
id
pwd


Init Script Log 확인

k logs -f ${INIT SCRIPT POD | NEW NODE}

ROOT 로 돌아간다.  node 에서 Root 로 테스트 후 반영

 

CSAP 보안 조치

INIT SCRIPT

#!/bin/bash

# change-passwd.sh

echo "User Create"
if id "user" &>/dev/null; then
    echo "User already exists. Skipping password change."
else
    sudo adduser --disabled-password --gecos "" user
    sudo usermod -aG sudo user
    echo "user:password" | sudo chpasswd
fi

# 추가할 내용
LINE="password requisite pam_pwquality.so enforce_for_root retry=3 minlen=8 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1"

# 파일에 내용이 없는 경우에만 추가
sudo sed -i "/^$LINE$/d" /etc/pam.d/common-password
echo "$LINE" | sudo tee -a /etc/pam.d/common-password

echo "SSHD RESTART"
sudo systemctl restart sshd

echo "CHECK COMMON-PASSWORD"
sudo cat /etc/pam.d/common-password


CSAP 에서 OpenSSH 버전 업그레이드 취약점  (대상 Ubuntu22.04 - KVM)

#!/bin/bash
## OpenSSH TEST
# 원하는 SSH 버전
TARGET_VERSION="9.8"
# 현재 SSH 버전 가져오기
CURRENT_VERSION=$(ssh -V 2>&1 | awk '{print $1}' | awk -F_ '{print $2}')
#CURRENT_VERSION="8.9p1"
# 버전 비교
if echo "$CURRENT_VERSION" | grep -q "$TARGET_VERSION"; then
    echo "현재 SSH 버전이 $TARGET_VERSION이므로 업그레이드가 필요하지 않습니다."
else
    echo "현재 SSH 버전: $CURRENT_VERSION, 업그레이드 필요: $TARGET_VERSION"
    # 필요한 패키지 설치
    sudo apt-get update
    sudo apt-get install -y zlib1g-dev libssl-dev
    # OpenSSH 9.8 소스 다운로드
    wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz
    # 소스 압축 해제 및 설치
    tar -xzf openssh-9.8p1.tar.gz
    cd openssh-9.8p1
    ./configure
    make
    sudo make install
    # SSH 서비스 재시작
    sudo systemctl restart ssh
    echo "SSH가 버전 $TARGET_VERSION으로 업그레이드되었습니다."
fi

ssh -V

로그 업로드

if command -v aws >/dev/null 2>&1; then
    echo "AWS CLI is installed."
    aws --version
else
    curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
    unzip awscliv2.zip
    sudo ./aws/install
    aws --version
    rm -rf awscliv2.zip aws
fi

# log_saver.sh 다운로드
S3_ENDPOINT="https://s3.com"             # S3 엔드포인트 URL
AWS_ACCESS_KEY_ID="access-key"     # AWS Access Key ID
AWS_SECRET_ACCESS_KEY="secret-key" # AWS Secret Access Key

# 환경 변수 설정
export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY

S3_PATH="os-log/log_saver.sh"

aws s3 cp "s3://$S3_PATH" / --endpoint-url "$S3_ENDPOINT"
chmod +x /log_saver.sh

# CRONJOB 설정
# 추가할 크론 작업
CRON_JOB="0 3 * * 1 /log_saver.sh"

# 현재 crontab 내용 백업
CRON_FILE=$(mktemp)
crontab -l > "$CRON_FILE" 2>/dev/null

# 기존에 log_saver.sh 관련 작업이 있으면 삭제
sed -i '/log_saver.sh/d' "$CRON_FILE"

# 새로운 크론 작업 추가
echo "$CRON_JOB" >> "$CRON_FILE"

# 수정된 크론 작업 등록
crontab "$CRON_FILE"

# 임시 파일 삭제
rm "$CRON_FILE"

echo "크론 작업이 성공적으로 업데이트되었습니다."

노드 추가시 NAS NACL 추가하기 위한 스크립트

#!/bin/bash
sudo apt-get install jq

# API 호출에 필요한 기본 변수 설정
#API_SERVER="http://ip:8000" api서버 주소 변경 필요
API_SERVER="https://ncloud.apigw.gov-ntruss.com"

API_PATH="/ncp/get/servers"
API_PATH2="/ncp/add/nas_acl"

hostname_value=$(hostname)

#node의 hostname을 통해 서버 인스턴스 번호 출력
API_URL="$API_SERVER$API_PATH?server_name=$hostname_value"
response=$(curl $API_URL)

server_instance=$(echo "$response" | jq -r '.result[0].server_instanace')

# 결과 출력
echo "Server Instance: $server_instance"

모든 nas의 nacl에 서버 instance 추가하는 api 호출
API_URL="$API_SERVER$API_PATH2?server_instance=$server_instance"
response=$(curl $API_URL)

echo "$response"

최종 스크립트

#!/bin/bash
# change-passwd.sh
################### USER CREATE ################################
echo "User Create"
if id "user" &>/dev/null; then
    echo "User already exists. Skipping password change."
else
    sudo adduser --disabled-password --gecos "" user
    sudo usermod -aG sudo user
    echo "user:password" | sudo chpasswd
fi
####################################################################


#################### CSAP #########################################
LINE="password requisite pam_pwquality.so enforce_for_root retry=3 minlen=8 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1"

# 파일에 내용이 없는 경우에만 추가
sudo sed -i "/^$LINE$/d" /etc/pam.d/common-password
echo "$LINE" | sudo tee -a /etc/pam.d/common-password

echo "SSHD RESTART"
sudo systemctl restart sshd

echo "CHECK COMMON-PASSWORD"
sudo cat /etc/pam.d/common-password
##################################################################

################## OpenSSH UPGRADE ##############################
# 원하는 SSH 버전
TARGET_VERSION="9.8"
# 현재 SSH 버전 가져오기
CURRENT_VERSION=$(ssh -V 2>&1 | awk '{print $1}' | awk -F_ '{print $2}')
#CURRENT_VERSION="8.9p1"
# 버전 비교
if echo "$CURRENT_VERSION" | grep -q "$TARGET_VERSION"; then
    echo "현재 SSH 버전이 $TARGET_VERSION이므로 업그레이드가 필요하지 않습니다."
else
    echo "현재 SSH 버전: $CURRENT_VERSION, 업그레이드 필요: $TARGET_VERSION"
    # 필요한 패키지 설치
    sudo apt-get update
    sudo apt-get install -y zlib1g-dev libssl-dev
    # OpenSSH 9.8 소스 다운로드
    wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz
    # 소스 압축 해제 및 설치
    tar -xzf openssh-9.8p1.tar.gz
    cd openssh-9.8p1
    ./configure
    make
    sudo make install
    # SSH 서비스 재시작
    sudo systemctl restart ssh
    echo "SSH가 버전 $TARGET_VERSION으로 업그레이드되었습니다."
fi

ssh -V
##################################################################


############################# AWS CLI 설치 ################################
if command -v aws >/dev/null 2>&1; then
    echo "AWS CLI is installed."
    aws --version
else
    curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
    unzip awscliv2.zip
    sudo ./aws/install
    aws --version
    rm -rf awscliv2.zip aws
fi
#############################################################################


################### log_saver.sh 다운로드 ########################
S3_ENDPOINT="https://s3.com"             # S3 엔드포인트 URL
AWS_ACCESS_KEY_ID="access-key"     # AWS Access Key ID
AWS_SECRET_ACCESS_KEY="secret-key" # AWS Secret Access Key

# 환경 변수 설정
export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY

S3_PATH="os-log/log_saver.sh"

aws s3 cp "s3://$S3_PATH" / --endpoint-url "$S3_ENDPOINT"
chmod +x /log_saver.sh
###################################################################


###################### CRONJOB 설정 ##############################
CRON_JOB="0 3 * * * /log_saver.sh"

# 현재 crontab 내용 백업
CRON_FILE=$(mktemp)
crontab -l > "$CRON_FILE" 2>/dev/null

# 기존에 log_saver.sh 관련 작업이 있으면 삭제
sed -i '/log_saver.sh/d' "$CRON_FILE"

# 새로운 크론 작업 추가
echo "$CRON_JOB" >> "$CRON_FILE"

# 수정된 크론 작업 등록
crontab "$CRON_FILE"

# 임시 파일 삭제
rm "$CRON_FILE"

systemctl restart cron
echo "크론 작업이 성공적으로 업데이트되었습니다."
###################################################################

댓글