#!/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|| \n \n \n \n|" "$USERS_XML" fi # ── Tomcat server.xml 보안 설정 ────────────────────────────── SERVER_XML="$TOMCAT_HOME/conf/server.xml" if [[ -f "$SERVER_XML" ]]; then # AJP 커넥터 비활성화 (보안) sed -i 's||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 "=================================================="