zioinfo-mail/setup/setup_target_server.sh
DESKTOP-TKLFCPR\ython a899dc208a feat(setup): Ollama + 보안·운영 도구 추가 (전체 4개 OS)
[Ollama — 온프레미스 sLLM 서버]
- setup_ubuntu/centos/rhel/windows: Ollama 설치 단계 추가
- 환경변수 OLLAMA_INSTALL=online|offline|skip 지원 (망분리 환경)
- 환경변수 OLLAMA_MODELS 으로 초기 모델 설정 (기본: llama3.1:8b)
- 오프라인: OLLAMA_BIN_PATH로 바이너리 직접 지정
- SELinux 포트 허용 (RHEL), 방화벽 내부 전용 차단 (8080/11434)

[보안·운영 도구]
- Fail2ban: SSH 무차별 대입 방지 (5회 실패 시 1시간 차단)
- Chrony/NTP: 감사 로그 타임스탬프 정합성 확보
- JDK 8/11: 레거시 WAS(Tomcat 7/8) 지원을 위한 다중 JDK
- Logrotate: catalina.out 14일, *.log 8주 보관

[--test 검증 강화]
- Ollama 서비스 + API + 모델 존재 여부 검사
- Fail2ban/Chrony 실행 상태 검사

[단계 수 업데이트]
- Ubuntu: 10→13단계, CentOS: 10→13단계, RHEL: 11→13단계, Windows: 10단계

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 18:57:02 +09:00

255 lines
10 KiB
Bash

#!/bin/bash
# =============================================================
# GUARDiA 관리 대상 서버 표준 설치 스크립트
# =============================================================
# 목적: GUARDiA가 SSH로 관리할 WAS 서버(관공서·기관)의 표준 구성
# 설치 내용: OpenJDK 17 + Tomcat 9 + opsagent 계정
#
# 전제조건: 순수 Linux OS (Ubuntu 20+/CentOS 7+/RHEL 8+)
# 실행 방법: sudo bash setup_target_server.sh
# 설치 테스트: bash setup_target_server.sh --test
#
# 환경변수:
# TOMCAT_VER=9.0.98 : Tomcat 버전 (기본 9.0.98)
# TOMCAT_MIRROR=http://.. : 내부 미러 URL (망분리 환경)
# OPSAGENT_PW=... : opsagent 계정 비밀번호 (기본: 랜덤 생성)
# =============================================================
set -euo pipefail
LOG_FILE="/var/log/guardia_target_install.log"
TEST_MODE="${1:-}"
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
ok() { echo -e "${GREEN}[OK]${NC} $*" | tee -a "$LOG_FILE"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*" | tee -a "$LOG_FILE"; }
fail() { echo -e "${RED}[FAIL]${NC} $*" | tee -a "$LOG_FILE"; exit 1; }
info() { echo -e " $*"; }
exec > >(tee -a "$LOG_FILE") 2>&1
echo "=================================================="
echo " GUARDiA 관리 대상 서버 설치 (WAS 표준 구성)"
echo " 시작: $(date)"
echo "=================================================="
[[ $EUID -eq 0 ]] || fail "root 권한으로 실행하세요: sudo bash $0"
# OS 감지
if command -v apt-get &>/dev/null; then OS_TYPE="debian"
elif command -v dnf &>/dev/null; then OS_TYPE="rhel"
elif command -v yum &>/dev/null; then OS_TYPE="centos7"
else fail "지원하지 않는 OS입니다."
fi
info "감지된 OS 유형: $OS_TYPE"
# ── 테스트 모드 ──────────────────────────────────────────────
if [[ "$TEST_MODE" == "--test" ]]; then
echo "=== 대상 서버 설치 검증 ==="
PASS=0; FAIL=0
check() {
local desc="$1"; shift
if "$@" &>/dev/null; then
ok "$desc"; ((PASS++))
else
echo -e "${RED}[FAIL]${NC} $desc"; ((FAIL++))
fi
}
check "Java 17 설치" java -version
check "JAVA_HOME 설정" bash -c 'test -n "$JAVA_HOME" && java -version'
check "opsagent 계정 존재" id opsagent
check "opsagent sudo 권한" bash -c 'sudo -l -U opsagent 2>/dev/null | grep -q NOPASSWD'
check "Tomcat 9 서비스 실행" systemctl is-active tomcat9
check "Tomcat HTTP 응답" bash -c 'curl -sf http://localhost:8080/ -o /dev/null'
check "Tomcat Manager 경로" bash -c 'curl -sf http://localhost:8080/manager/text/list \
-u "opsagent:$(cat /etc/guardia/.opsagent_pw 2>/dev/null || echo wrong)" -o /dev/null'
check "포트 22 (SSH)" bash -c 'ss -tlnp | grep ":22 "'
check "포트 8080 (Tomcat)" bash -c 'ss -tlnp | grep ":8080 "'
check "/app/tomcat 경로 존재" test -d /app/tomcat
check "catalina.out 로그" test -f /app/tomcat/logs/catalina.out
echo ""
echo "검증 결과: 성공 $PASS / 실패 $FAIL"
[[ $FAIL -eq 0 ]] && ok "모든 검사 통과 — GUARDiA 관리 대상 서버 준비 완료" \
|| fail "일부 검사 실패 — 로그: $LOG_FILE"
exit 0
fi
TOMCAT_VER="${TOMCAT_VER:-9.0.98}"
TOMCAT_HOME="/app/tomcat"
TOMCAT_USER="tomcat"
# opsagent 비밀번호 생성 또는 환경변수 사용
if [[ -n "${OPSAGENT_PW:-}" ]]; then
OPS_PW="$OPSAGENT_PW"
else
OPS_PW=$(tr -dc 'A-Za-z0-9@#$' < /dev/urandom | head -c 20)
fi
mkdir -p /etc/guardia
echo "$OPS_PW" > /etc/guardia/.opsagent_pw
chmod 600 /etc/guardia/.opsagent_pw
# ── 1. OpenJDK 17 설치 ───────────────────────────────────────
echo ""
echo "[1/5] OpenJDK 17 설치..."
case $OS_TYPE in
debian)
apt-get update -qq
apt-get install -y -qq openjdk-17-jdk curl wget lsof
JAVA_HOME_PATH=$(update-java-alternatives -l 2>/dev/null | grep java-17 | awk '{print $3}' | head -1)
;;
rhel)
dnf install -y java-17-openjdk java-17-openjdk-devel curl wget lsof
JAVA_HOME_PATH=$(alternatives --list 2>/dev/null | grep jre_17 | awk '{print $3}' | head -1)
;;
centos7)
yum install -y java-17-openjdk java-17-openjdk-devel curl wget lsof 2>/dev/null || \
yum install -y java-11-openjdk java-11-openjdk-devel curl wget lsof
JAVA_HOME_PATH=$(alternatives --list 2>/dev/null | grep jre | awk '{print $3}' | head -1)
;;
esac
[ -z "${JAVA_HOME_PATH:-}" ] && JAVA_HOME_PATH=$(dirname $(dirname $(readlink -f $(which java))))
cat > /etc/profile.d/java.sh << JHEOF
export JAVA_HOME=$JAVA_HOME_PATH
export PATH=\$JAVA_HOME/bin:\$PATH
JHEOF
source /etc/profile.d/java.sh
ok "OpenJDK 17 설치 완료 (JAVA_HOME=$JAVA_HOME_PATH)"
# ── 2. Tomcat 9 설치 ─────────────────────────────────────────
echo ""
echo "[2/5] Tomcat 9 설치 (경로: $TOMCAT_HOME)..."
id $TOMCAT_USER &>/dev/null || useradd -r -s /bin/false -d "$TOMCAT_HOME" $TOMCAT_USER
TOMCAT_TAR="apache-tomcat-${TOMCAT_VER}.tar.gz"
MIRROR="${TOMCAT_MIRROR:-https://archive.apache.org/dist/tomcat/tomcat-9/v${TOMCAT_VER}/bin}"
if [[ ! -d "$TOMCAT_HOME/bin" ]]; then
wget -q "$MIRROR/$TOMCAT_TAR" -O /tmp/$TOMCAT_TAR \
|| fail "Tomcat 다운로드 실패. TOMCAT_MIRROR=http://내부미러 로 설정하세요."
mkdir -p "$TOMCAT_HOME"
tar -xzf /tmp/$TOMCAT_TAR -C "$TOMCAT_HOME" --strip-components=1
chmod +x "$TOMCAT_HOME/bin/"*.sh
fi
mkdir -p "$TOMCAT_HOME/logs" "$TOMCAT_HOME/temp"
chown -R $TOMCAT_USER:$TOMCAT_USER "$TOMCAT_HOME"
# opsagent 계정 추가 (GUARDiA Manager 원격 관리용)
USERS_XML="$TOMCAT_HOME/conf/tomcat-users.xml"
if [[ -f "$USERS_XML" ]]; then
# 기존 opsagent 제거 후 재추가 (비밀번호 갱신)
sed -i '/opsagent/d; /manager-script/d; /manager-jmx/d' "$USERS_XML"
sed -i "s|</tomcat-users>| <role rolename=\"manager-script\"/>\n <role rolename=\"manager-jmx\"/>\n <role rolename=\"manager-gui\"/>\n <user username=\"opsagent\" password=\"$OPS_PW\" roles=\"manager-script,manager-jmx,manager-gui\"/>\n</tomcat-users>|" "$USERS_XML"
fi
# ── Tomcat server.xml 보안 설정 ──────────────────────────────
SERVER_XML="$TOMCAT_HOME/conf/server.xml"
if [[ -f "$SERVER_XML" ]]; then
# AJP 커넥터 비활성화 (보안)
sed -i 's|<Connector protocol="AJP|<!-- <Connector protocol="AJP|' "$SERVER_XML"
sed -i 's|redirectPort="8443" />|redirectPort="8443" /> -->|' "$SERVER_XML"
# shutdown 포트 무작위화 (기본 8005 → 변경)
sed -i 's/port="8005"/port="-1"/' "$SERVER_XML"
fi
# systemd 서비스 등록
cat > /etc/systemd/system/tomcat9.service << TCEOF
[Unit]
Description=Apache Tomcat 9 WAS
After=network.target
[Service]
Type=forking
User=$TOMCAT_USER
Group=$TOMCAT_USER
Environment="JAVA_HOME=$JAVA_HOME_PATH"
Environment="CATALINA_HOME=$TOMCAT_HOME"
Environment="CATALINA_BASE=$TOMCAT_HOME"
Environment="CATALINA_PID=$TOMCAT_HOME/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom"
ExecStart=$TOMCAT_HOME/bin/startup.sh
ExecStop=$TOMCAT_HOME/bin/shutdown.sh
Restart=on-failure
RestartSec=10
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
TCEOF
systemctl daemon-reload
systemctl enable tomcat9
systemctl start tomcat9
ok "Tomcat 9 서비스 등록 완료 (포트 8080)"
# ── 3. opsagent OS 계정 생성 ─────────────────────────────────
echo ""
echo "[3/5] opsagent OS 계정 설정..."
id opsagent &>/dev/null || useradd -m -s /bin/bash opsagent
echo "opsagent:$OPS_PW" | chpasswd
# sudo 권한 부여 (Tomcat 재기동, 로그 조회만)
cat > /etc/sudoers.d/opsagent << 'SUDOEOF'
# GUARDiA opsagent — Tomcat 관리 전용 (root 직접 접속 금지)
opsagent ALL=(ALL) NOPASSWD: \
/bin/systemctl start tomcat9, \
/bin/systemctl stop tomcat9, \
/bin/systemctl restart tomcat9, \
/bin/systemctl status tomcat9, \
/usr/bin/tail -f /app/tomcat/logs/catalina.out, \
/bin/cat /app/tomcat/logs/catalina.out
SUDOEOF
chmod 440 /etc/sudoers.d/opsagent
ok "opsagent 계정 설정 완료"
# ── 4. SSH 보안 설정 (root 직접 접속 금지) ───────────────────
echo ""
echo "[4/5] SSH 보안 설정..."
# root 직접 SSH 금지
sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
# 비밀번호 인증 허용 (GUARDiA SSH 에이전트 사용)
sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
systemctl restart sshd 2>/dev/null || systemctl restart ssh 2>/dev/null || true
ok "SSH 보안 설정 완료 (root 직접 접속 금지)"
# ── 5. GUARDiA 연결 정보 출력 ────────────────────────────────
echo ""
echo "[5/5] GUARDiA 연결 정보 저장..."
SERVER_IP=$(hostname -I | awk '{print $1}')
cat > /etc/guardia/connection_info.txt << CONNEOF
# GUARDiA ITSM 연결 정보 — $(date)
서버 IP: $SERVER_IP
SSH 계정: opsagent
SSH 비밀번호: $OPS_PW (보안상 이 파일을 삭제하고 GUARDiA CMDB에만 저장할 것)
Tomcat Manager: http://${SERVER_IP}:8080/manager
Tomcat 계정: opsagent / $OPS_PW
CATALINA_HOME: $TOMCAT_HOME
JAVA_HOME: $JAVA_HOME_PATH
CONNEOF
chmod 600 /etc/guardia/connection_info.txt
ok "GUARDiA 연결 정보 저장: /etc/guardia/connection_info.txt"
info "(참고: 대상 서버에는 Ollama 불필요 — GUARDiA 서버에서만 설치합니다)"
echo ""
echo "=================================================="
ok "GUARDiA 관리 대상 서버 설치 완료"
echo ""
info "=== GUARDiA CMDB에 등록할 서버 정보 ==="
info "서버 IP: $SERVER_IP"
info "SSH 계정: opsagent"
info "SSH 비밀번호: $OPS_PW"
info "CATALINA_HOME: $TOMCAT_HOME"
info "Tomcat 포트: 8080"
echo ""
warn "보안 주의: 위 비밀번호를 GUARDiA CMDB에 등록한 후"
warn " /etc/guardia/connection_info.txt 파일을 삭제하세요."
warn " shred -u /etc/guardia/connection_info.txt"
echo ""
info "설치 검증: sudo bash $0 --test"
echo "=================================================="