[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>
255 lines
10 KiB
Bash
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 "=================================================="
|