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 "크론 작업이 성공적으로 업데이트되었습니다."
###################################################################
'Cloud' 카테고리의 다른 글
[Kafka] Message size 제한 이슈 대응기 (0) | 2025.01.18 |
---|---|
[Gitlab] Backup, Restore 이후 500 에러 트러블 슈팅 (0) | 2025.01.13 |
[ArgoCD] 계정 생성 (1) | 2024.12.27 |
[ArgoCD] FE 배포 Helm 구성기 (1) | 2024.12.27 |
[Tempo] Grafana Tempo 적용기 (2) (0) | 2024.11.19 |
댓글