[WebSphere] Liberty Cluster: End-to-End ๊ตฌ์ถ• ๋ฐ ๊ตฌ์„ฑ ๊ฐ€์ด๋“œ

Summary: WebSphere Liberty Profile(WLP)์˜ Collective ๋ฐ Cluster ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•œ ์ธํ”„๋ผ ๊ตฌ์ถ• ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค. Controller ๊ตฌ์„ฑ๋ถ€ํ„ฐ Member ์กฐ์ธ, ํด๋Ÿฌ์Šคํ„ฐ๋ง ์„ค์ • ๋ฐ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…๊นŒ์ง€์˜ ์ „์ฒด ๊ณผ์ •์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

WebSphere Application Server Liberty Profile(WLP)์€ ๊ฒฝ๋Ÿ‰ํ™”๋œ ๊ตฌ์กฐ์™€ ํ™•์žฅ์„ฑ ๋•๋ถ„์— ์ฑ„ํƒ๋ฅ ์ด ๋†’์•„์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ ํฌ์ŠคํŠธ๋Š” WLP Collective์™€ Clustering ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ† ํด๋กœ์ง€๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ•œ ์—”์ง€๋‹ˆ์–ด๋ง ๋…ธํŠธ์ž…๋‹ˆ๋‹ค.

์ด ์‹œ๋ฆฌ์ฆˆ๋Š” ๋‹ค์Œ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

  • How to Create and Configure WebSphere Liberty Cluster End-to-End (Current)
  • How to Deploy Application in WebSphere Liberty Cluster
  • How to Setup Front-End Web Server for WebSphere Liberty Cluster

1. Topology Architecture

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” Collective Controller 1๋Œ€์™€ Collective/Cluster Member 2๋Œ€๋กœ ๊ตฌ์„ฑ๋œ ํ† ํด๋กœ์ง€๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์—๋Š” IBM HTTP Server(IHS)๊ฐ€ ๋ฐฐ์น˜๋˜๋ฉฐ ๋ณ„๋„์˜ ๋ฐฐํฌ ์„œ๋ฒ„๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

2. Prerequisites & WLP Installation

๋ณธ ๊ฐ€์ด๋“œ๋Š” WLP 17.0.2 ๋ฐ CentOS Linux 7.3 ํ™˜๊ฒฝ์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„ค์น˜ ์ „ ์ง€์›๋˜๋Š” Java ๋ฒ„์ „์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Check System Environment

$> cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

$> ./java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build pxa6480sr4fp5-20170421_01(SR4 FP5))
IBM J9 VM (build 2.8, JRE 1.8.0 Linux amd64-64 Compressed References 20170419_344392)

Base Installation (Machine: 02)

๋จผ์ € Controller๊ฐ€ ๋  ๋จธ์‹ (Machine: 02)์— WLP๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๋’ค, ์ด๋ฅผ ํŒจํ‚ค์ง•ํ•˜์—ฌ Member ์„œ๋ฒ„๋“ค(Machine: 03, 04)๋กœ ๋ฐฐํฌํ•˜๋Š” ์ „๋žต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

# Create directory
$> sudo mkdir -p /opt/ibm

# Change ownership
$> sudo chown -R wasadmin:wasgrp /opt/ibm

# Install WLP
$> java -jar wlp-17.0.0.2-all.jar --acceptLicense /opt/ibm

# Verify version
$> cd /opt/ibm/wlp/bin
$> ./productInfo version
Product name: WebSphere Application Server
Product version: 17.0.0.2

Install Required Features

Collective, Cluster, SSL, JMX Connector ๋“ฑ์˜ ํ•„์ˆ˜ ๊ธฐ๋Šฅ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

$> ./installUtility install collectiveController-1.0 collectiveMember-1.0 clusterMember-1.0 websocket-1.1 restConnector-2.0 ssl-1.0 localConnector-1.0 adminCenter-1.0

Package and Distribute

์„ค์น˜๋œ ํ™˜๊ฒฝ์„ wlp_install.jar๋กœ ํŒจํ‚ค์ง•ํ•˜์—ฌ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.

# Create defaultServer for packaging context
$> ./server create

# Package server including all binaries
$> ./server package defaultServer --archive=/tmp/wlp_install.jar --include=all
Server defaultServer package complete in /tmp/wlp_install.jar.

์ƒ์„ฑ๋œ wlp_install.jar๋ฅผ Machine 03, 04๋กœ ์ „์†กํ•œ ํ›„ ๋™์ผํ•˜๊ฒŒ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

# On Machine 03 & 04
$> sudo mkdir -p /opt/ibm
$> chown -R wasadmin:wasgrp /opt/ibm
$> java -jar wlp_install.jar --acceptLicense /opt/ibm

3. Setup Collective Controller (Machine: 02)

Controller ์„œ๋ฒ„(wlpCntlr)๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑ์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

# Create server
$> ./server create wlpCntlr

# Initialize Collective Controller
$> ./collective create wlpCntlr --keystorePassword=<password> --createConfigFile=/opt/ibm/wlp/usr/servers/wlpCntlr/wlpcntlr_include.xml

์œ„ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ธ์ฆ์„œ ์ƒ์„ฑ ๋ฐ wlpcntlr_include.xml ์„ค์ • ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ server.xml๊ณผ include ํŒŒ์ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

Configuration: server.xml (Controller)

<server description="CollectiveController">
    <featureManager>
        <feature>adminCenter-1.0</feature>
        <feature>websocket-1.1</feature>
        <feature>restConnector-1.0</feature>
        <feature>localConnector-1.0</feature>
    </featureManager>

    <!-- Include generated config -->
    <include location="${server.config.dir}/wlpcntlr_include.xml" />

    <httpEndpoint id="defaultHttpEndpoint" httpPort="9080" httpsPort="9443" host="*" />
</server>

Configuration: wlpcntlr_include.xml

์ž๋™ ์ƒ์„ฑ๋œ ํŒŒ์ผ์—์„œ quickStartSecurity ๋ถ€๋ถ„์„ ๋ณธ์ธ์˜ ๊ณ„์ • ์ •๋ณด๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

<quickStartSecurity userName="wasadmin" userPassword="{xor}EncryptedPassword..." />

Firewall Configuration

CentOS ๋ฐฉํ™”๋ฒฝ์—์„œ 9080, 9443 ํฌํŠธ๋ฅผ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

$> sudo firewall-cmd --zone=public --permanent --add-port=9443/tcp
$> sudo firewall-cmd --zone=public --permanent --add-port=9080/tcp
$> sudo firewall-cmd --reload

Start Controller

$> ./server start wlpCntlr

๋กœ๊ทธ(messages.log)์—์„œ CWWKX6011I: The collective controller is ready ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Admin Center(https://hostname:9443/adminCenter/) ์ ‘์†๋„ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. Setup Collective & Cluster Members

Machine 03๊ณผ 04์—์„œ ๋ฉค๋ฒ„ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Controller์— Join ์‹œํ‚ต๋‹ˆ๋‹ค.

Create & Join Member (Machine: 03)

# Create Server
$> ./server create wlpSrv01

# Join Collective
$> ./collective join wlpSrv01 \
  --host=waslibctlr01 \
  --port=9443 \
  --user=wasadmin \
  --password=<password> \
  --keystorePassword=<password> \
  --createConfigFile=/opt/ibm/wlp/usr/servers/wlpSrv01/wlpsrv01_include.xml

SSL Handshake ๊ณผ์ •์—์„œ ์ธ์ฆ์„œ๋ฅผ ์‹ ๋ขฐํ•˜๊ฒ ๋ƒ๋Š” ํ”„๋กฌํ”„ํŠธ์— y๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Configuration: server.xml (Member)

Member ์„œ๋ฒ„์˜ server.xml์— Cluster ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ , Controller๊ฐ€ ๋ฐฐํฌ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก remoteFileAccess๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

<server description="Cluster Member">
    <featureManager>
        <feature>webProfile-7.0</feature>
        <feature>restConnector-1.0</feature>
        <feature>localConnector-1.0</feature>
        <!-- Added for Clustering -->
        <feature>clusterMember-1.0</feature>
    </featureManager>

    <include location="${server.config.dir}/wlpsrv01_include.xml" />

    <!-- Define Cluster Name -->
    <clusterMember name="wlpCluster"/>

    <httpEndpoint id="defaultHttpEndpoint" httpPort="9081" httpsPort="9444" host="*" />

    <!-- Write Access for Controller -->
    <remoteFileAccess>
        <writeDir>${server.config.dir}</writeDir>
    </remoteFileAccess>
</server>

Machine: 04 (wlpSrv02)์— ๋Œ€ํ•ด์„œ๋„ ์œ„ ๊ณผ์ •์„ ๋™์ผํ•˜๊ฒŒ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

Security Considerations (LTPA)

ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์—์„œ ์„ธ์…˜ ๊ณต์œ  ๋ฐ ๋ณด์•ˆ์„ ์œ„ํ•ด ๋ชจ๋“  ๋ฉค๋ฒ„๋Š” ๋™์ผํ•œ LTPA ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์„œ๋ฒ„์—์„œ ์ƒ์„ฑ๋œ ltpa.keys ํŒŒ์ผ์„ ๋‹ค๋ฅธ ๋ฉค๋ฒ„ ์„œ๋ฒ„๋“ค์˜ ๋™์ผํ•œ ๊ฒฝ๋กœ(${server.ouput.dir}/resources/security/)๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

5. Start Members & Verification

๊ฐ ๋…ธ๋“œ์—์„œ ๋ฉค๋ฒ„ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

$> ./server start wlpSrv01  # On Machine 03
$> ./server start wlpSrv02  # On Machine 04

๋กœ๊ทธ ํŒŒ์ผ์—์„œ ๋‹ค์Œ ๋ฉ”์‹œ์ง€๋“ค์„ ํ™•์ธํ•˜์—ฌ ์ •์ƒ ๊ตฌ๋™์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

  • CWWKX8112I: Collective Repository์— ํ˜ธ์ŠคํŠธ ์ •๋ณด ๊ฒŒ์‹œ ์„ฑ๊ณต.
  • CWWKX7400I: ClusterMember MBean ํ™œ์„ฑํ™” (ํด๋Ÿฌ์Šคํ„ฐ ์กฐ์ธ ์„ฑ๊ณต).

6. Troubleshooting Notes

์„ค์ • ๊ณผ์ •์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • CWWKX0229E (401 Unauthorized / 403 Forbidden)
    collective join ์‹œ ์ธ์ฆ ์‹คํŒจ. quickStartSecurity์˜ ๊ณ„์ • ์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. 403 ์—๋Ÿฌ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ administrator-role์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • CWWKS9582E (SSL unresolved)
    IIOP ๋ณด์•ˆ ์„ค์ • ์‹œ SSL ์ฐธ์กฐ ์˜ค๋ฅ˜. server.xml์— SSL ๊ตฌ์„ฑ ๋ฐ KeyStore ์ •์˜๊ฐ€ ๋ช…ํ™•ํ•œ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • CWWKO0221E / CWWKS9580E (Port in use)
    ํ•œ ํ˜ธ์ŠคํŠธ์— ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„์šธ ๊ฒฝ์šฐ JMS ํฌํŠธ(7276)๋‚˜ IIOP ํฌํŠธ(2809) ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. wasJmsEndpoint ๋ฐ iiopEndpoint ์„ค์ •์„ ํ†ตํ•ด ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Next Step: ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” ์ด ํด๋Ÿฌ์Šคํ„ฐ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

[Tomcat] ์ฃผ์š” ์„ค์ • ํŒŒ์ผ(server.xml, web.xml) ์™„๋ฒฝ ๋ถ„์„ ๋ฐ ํ•„์ˆ˜ ํŠœ๋‹ ํฌ์ธํŠธ

Apache Tomcat์˜ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” ํ•ต์‹ฌ ์„ค์ • ํŒŒ์ผ๋“ค์€ ๋ชจ๋‘ /conf ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ server.xml(ํฌํŠธ, ์ปค๋„ฅํ„ฐ)๊ณผ web.xml(์„ธ์…˜, MIME)์˜ ์—ญํ• ๊ณผ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์„ค์ • ๋ณ€๊ฒฝ ๊ฐ€์ด๋“œ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. ์„ค์ • ํŒŒ์ผ ๊ฐœ์š” (Configuration Overview)

Tomcat ์„ค์น˜ ๊ฒฝ๋กœ ๋‚ด conf ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” XML ํŒŒ์ผ๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ๋ช… ์ฃผ์š” ์—ญํ•  ๋ฐ ์„ค๋ช…
server.xml Tomcat์˜ ๋ฉ”์ธ ์„ค์ • ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
- HTTP/AJP ํฌํŠธ ์„ค์ •
- ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ(Host) ๋ฐ Context ์„ค์ •
- ์“ฐ๋ ˆ๋“œ ํ’€(Thread Pool) ๊ด€๋ฆฌ
web.xml ๋ชจ๋“  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ณธ ์†์„ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
- ์„ธ์…˜ ํƒ€์ž„์•„์›ƒ(Session Timeout) ์„ค์ •
- MIME ํƒ€์ž… ์ •์˜, ๊ธฐ๋ณธ ์„œ๋ธ”๋ฆฟ ๋งคํ•‘
context.xml ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Context ์„ค์ •์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
- JNDI ๋ฆฌ์†Œ์Šค(DB Connection Pool) ์„ค์ • ์‹œ ์ฃผ๋กœ ์‚ฌ์šฉ
tomcat-users.xml Tomcat Manager/Admin ํŽ˜์ด์ง€ ์ ‘๊ทผ ๊ณ„์ •์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

2. server.xml ์ฃผ์š” ์„ค์ • ๊ฐ€์ด๋“œ

์—”์ง€๋‹ˆ์–ด๊ฐ€ ๊ฐ€์žฅ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ˆ˜์ •ํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ํฌํŠธ ์ถฉ๋Œ ํ•ด๊ฒฐ์ด๋‚˜ ์ธ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1) HTTP ํฌํŠธ ๋ณ€๊ฒฝ ๋ฐ ์ธ์ฝ”๋”ฉ ์„ค์ •

๊ธฐ๋ณธ 8080 ํฌํŠธ๋ฅผ 80์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ํ•œ๊ธ€ ๊นจ์ง ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด URIEncoding์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

<!-- ๊ธฐ๋ณธ ์„ค์ • -->
<Connector port="8080" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443" />

<!-- ํŠœ๋‹ ์„ค์ • ์˜ˆ์‹œ -->
<Connector port="80" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443"
           URIEncoding="UTF-8" />
Tip: GET ๋ฐฉ์‹์œผ๋กœ ๋„˜์–ด์˜ค๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ•œ๊ธ€์ด ๊นจ์ง„๋‹ค๋ฉด URIEncoding="UTF-8" ์†์„ฑ์ด ๋ˆ„๋ฝ๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

2) AJP ํฌํŠธ ์„ค์ • (์›น ์„œ๋ฒ„ ์—ฐ๋™ ์‹œ)

Apache HTTP Server์™€ ์—ฐ๋™ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” AJP ํ”„๋กœํ† ์ฝœ ํฌํŠธ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

<!-- ๊ธฐ๋ณธ๊ฐ’ 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

3. web.xml ์ฃผ์š” ์„ค์ • ๊ฐ€์ด๋“œ

๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ์šฉ๋˜๋Š” ์ „์—ญ(Global) ์„ค์ •์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

1) ์„ธ์…˜ ํƒ€์ž„์•„์›ƒ (Session Timeout)

์‚ฌ์šฉ์ž ์„ธ์…˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. (๋‹จ์œ„: ๋ถ„)

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

2) ๋””๋ ‰ํ† ๋ฆฌ ๋ฆฌ์ŠคํŒ… ๋น„ํ™œ์„ฑํ™” (๋ณด์•ˆ)

ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ ์‹œ ํŒŒ์ผ ๋ชฉ๋ก์ด ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด listings ๊ฐ’์„ false๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value> <!-- true๋ฉด ํŒŒ์ผ ๋ชฉ๋ก ๋…ธ์ถœ๋จ -->
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

4. tomcat-users.xml (Manager App)

http://localhost:8080/manager ํŽ˜์ด์ง€์— ์ ‘์†ํ•˜์—ฌ GUI๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜ ์ค‘์ง€ํ•˜๋ ค๋ฉด ๊ณ„์ • ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

<tomcat-users>
  <!-- ์—ญํ•  ์ •์˜ -->
  <role rolename="manager-gui"/>
  <role rolename="admin-gui"/>
  
  <!-- ์‚ฌ์šฉ์ž ์ •์˜ -->
  <user username="admin" password="password" roles="manager-gui,admin-gui"/>
</tomcat-users>
์ฃผ์˜: Manager App์€ ๊ฐ•๋ ฅํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง€๋ฏ€๋กœ, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์™ธ๋ถ€ IP ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Next Step:
์„ค์ • ํŒŒ์ผ ์ˆ˜์ • ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ Tomcat์„ ์žฌ๊ธฐ๋™ํ•ด์•ผ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•œ JVM ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •(Heap Size)๊ณผ GC ํŠœ๋‹ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

[IHS/Liberty] ๋ณด์•ˆ ์ทจ์•ฝ์  ์กฐ์น˜: X-Powered-By ํ—ค๋” ์ˆจ๊น€ ๋ฐ ์ •๋ณด ๋…ธ์ถœ ๋ฐฉ์ง€ ๊ฐ€์ด๋“œ

IBM HTTP Server(IHS)์™€ WebSphere Liberty ํ™˜๊ฒฝ์—์„œ X-Powered-By ํ—ค๋”(์˜ˆ: Servlet/3.1) ๋…ธ์ถœ์„ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด ์›น ์„œ๋ฒ„(IHS) ๋‹จ์—์„œ์˜ ํ•„ํ„ฐ๋ง๊ณผ WAS(Liberty) ๋‹จ์—์„œ์˜ ์ƒ์„ฑ ๊ธˆ์ง€ ์„ค์ •์„ ๋ชจ๋‘ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์ „๋žต (Context)

๋ณด์•ˆ ์ทจ์•ฝ์  ์กฐ์น˜ ์‹œ, ์ •๋ณด ๋…ธ์ถœ ๋ฐฉ์ง€๋Š” ๋‹ค๊ณ„์ธต ๋ฐฉ์–ด(Defense in Depth)๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ณ„์ธต ์—ญํ•  ๋ฐ ์ค‘์š”์„ฑ
1. IHS (Web Server) [ํ•„์ˆ˜] ์ตœ์ „๋ฐฉ ๋ฐฉ์–ด์„ . ๋ฐฑ์—”๋“œ WAS๊ฐ€ ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์ด ํด๋ผ์ด์–ธํŠธ๋กœ ๋‚˜๊ฐ€๋Š” ๋ชจ๋“  ์‘๋‹ต์—์„œ ํ—ค๋”๋ฅผ ๊ฐ•์ œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
2. Liberty (WAS) [๊ถŒ์žฅ] ์†Œ์Šค ์ฐจ๋‹จ. ๋‚ด๋ถ€๋ง์—์„œ WAS๋กœ ์ง์ ‘ ์ ‘์†ํ•˜๋Š” ๊ฒฝ์šฐ๋‚˜ ์›น ์„œ๋ฒ„ ์„ค์ •์„ ์šฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด ํ—ค๋” ์ƒ์„ฑ ์ž์ฒด๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค.

Test Environment

  • Web Server: IBM HTTP Server v9.0 (Apache 2.4 Base)
  • WAS: WebSphere Liberty Core 20.0.x

1. IBM HTTP Server (IHS) ์„ค์ •

Apache ๊ธฐ๋ฐ˜์ธ IHS์—์„œ๋Š” mod_headers ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต ํ—ค๋”๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

httpd.conf ์ˆ˜์ •

์„ค์ • ํŒŒ์ผ(httpd.conf)์„ ์—ด์–ด ์•„๋ž˜ ๋‚ด์šฉ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

# 1. ๋ชจ๋“ˆ ๋กœ๋“œ ํ™•์ธ (์ฃผ์„ ํ•ด์ œ ํ•„์ˆ˜)
LoadModule headers_module modules/mod_headers.so

# 2. ํ—ค๋” ์ œ๊ฑฐ ์„ค์ • (Global ์˜์—ญ ๋˜๋Š” VirtualHost ๋‚ด๋ถ€์— ์ž‘์„ฑ)
<IfModule mod_headers.c>
    # ๋ณด์•ˆ ์กฐ์น˜: ๊ธฐ์ˆ  ์Šคํƒ ์ •๋ณด ์ˆจ๊น€
    Header unset X-Powered-By
    
    # (์„ ํƒ) ์ถ”๊ฐ€์ ์ธ ์ •๋ณด ๋…ธ์ถœ ํ—ค๋” ์ฐจ๋‹จ
    Header unset X-AspNet-Version
    Header unset X-Runtime
</IfModule>

# 3. ์„œ๋ฒ„ ๋ฒ„์ „ ์ •๋ณด ์ตœ์†Œํ™” (OS ์ •๋ณด ๋“ฑ ์ˆจ๊น€)
ServerTokens Prod
Tip: ์„ค์ • ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ ./apachectl -t๋กœ ๋ฌธ๋ฒ•์„ ๊ฒ€์‚ฌํ•˜๊ณ  ์žฌ๊ธฐ๋™(restart ๋˜๋Š” graceful)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. WebSphere Liberty ์„ค์ •

Liberty๋Š” server.xml ํŒŒ์ผ ํ•˜๋‚˜๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์„ค์ •์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. webContainer ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜์—ฌ ํ—ค๋” ์ƒ์„ฑ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

server.xml ์ˆ˜์ •

<server description="Liberty Server">

    <!-- Feature Manager (๊ธฐ๋ณธ ์„ค์ •) -->
    <featureManager>
        <feature>servlet-3.1</feature>
    </featureManager>

    <!-- [๋ณด์•ˆ ์กฐ์น˜] X-Powered-By ํ—ค๋” ๋น„ํ™œ์„ฑํ™” ์†์„ฑ ์ถ”๊ฐ€ -->
    <webContainer disableXPoweredBy="true" />

</server>

Liberty๋Š” ๋™์  ์„ค์ •์„ ์ง€์›ํ•˜๋ฏ€๋กœ ํŒŒ์ผ ์ €์žฅ ์‹œ ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์ง€๋งŒ, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํ™•์‹คํ•œ ์ ์šฉ์„ ์œ„ํ•ด ์„œ๋ฒ„ ์žฌ๊ธฐ๋™์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.


3. ๊ฒ€์ฆ (Verification)

curl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์น˜ ์ „ํ›„์˜ ์‘๋‹ต ํ—ค๋”๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

์กฐ์น˜ ์ „ (Before)

HTTP/1.1 200 OK
X-Powered-By: Servlet/3.1
Server: IBM_HTTP_Server/9.0.5...
...

์กฐ์น˜ ํ›„ (After)

curl -I http://localhost:80/
HTTP/1.1 200 OK
Server: IBM_HTTP_Server   <-- (Prod ์„ค์ •์œผ๋กœ ๋ฒ„์ „ ์ˆจ๊น€)
Content-Type: text/html
...                       <-- (X-Powered-By ํ—ค๋” ์‚ญ์ œ๋จ)

Next Step:
ํ—ค๋” ์กฐ์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด, HTTP ๋ฉ”์†Œ๋“œ ์ œํ•œ(GET, POST ์™ธ ์ฐจ๋‹จ) ๋ฐ SSL/TLS ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „(TLS 1.2 Only) ์„ค์ •์„ ํ†ตํ•ด ์›น ์„œ๋น„์Šค ๋ณด์•ˆ์„ ํ•œ ๋‹จ๊ณ„ ๋” ๊ฐ•ํ™”ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[Apache/IHS] ์„œ๋ฒ„ ์„ฑ๋Šฅ ํŠœ๋‹์˜ ํ•ต์‹ฌ: MaxRequestWorkers ๊ณ„์‚ฐ๋ฒ• ๋ฐ MPM ์„ค์ • ์™„๋ฒฝ ๊ฐ€์ด๋“œ

"์‚ฌ์šฉ์ž๊ฐ€ ๋ชฐ๋ฆฌ๋ฉด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์ด ์—†์–ด์š”." ์ด๋Ÿฐ ๋ฌธ์ œ์˜ 90%๋Š” ๋™์‹œ ์ ‘์†์ž ์ฒ˜๋ฆฌ ์„ค์ •์ธ MPM(Multi-Processing Module) ํŠœ๋‹์œผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ํ•œ๊ณ„ ๋‚ด์—์„œ ์ตœ๋Œ€ ์„ฑ๋Šฅ์„ ๋Œ์–ด๋‚ด๋Š” MaxRequestWorkers ์„ค์ •๋ฒ•๊ณผ ServerLimit์˜ ๊ด€๊ณ„๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

0. ํŠœ๋‹์˜ ํ•ต์‹ฌ ๊ณต์‹ (The Formula)

ํŠœ๋‹์€ '๊ฐ'์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ์ธํ•œ ์Šค์™‘(Swap) ๋ฐœ์ƒ์„ ๋ง‰๋Š” ๊ฒƒ์ด ์ตœ์šฐ์„  ๋ชฉํ‘œ์ด๋ฉฐ, ์ด๋Š” ์ •ํ™•ํ•œ ๊ณ„์‚ฐ์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

MaxRequestWorkers = (์ด RAM - OS/DB ์‚ฌ์šฉ RAM) / (Apache ํ”„๋กœ์„ธ์Šค 1๊ฐœ์˜ ํ‰๊ท  ๋ฉ”๋ชจ๋ฆฌ)

1. 3๋‹จ๊ณ„ ๊ณ„์‚ฐ๋ฒ•: ๋‚ด ์„œ๋ฒ„์˜ ํ•œ๊ณ„๊ฐ’ ์ฐพ๊ธฐ

Step 1: Apache ํ”„๋กœ์„ธ์Šค ํ‰๊ท  ๋ฉ”๋ชจ๋ฆฌ ์ธก์ •

๋จผ์ €, ํ˜„์žฌ ๊ตฌ๋™ ์ค‘์ธ httpd(๋˜๋Š” apache2) ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ(RSS)์˜ ํ‰๊ท ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

# SSH ์ ‘์† ํ›„ ์‹คํ–‰ (๊ฒฐ๊ณผ ๋‹จ์œ„: MB)
ps -ylC httpd --sort:rss | awk '{sum+=$8; ++n} END {print "Average RSS: " sum/n/1024 " MB"}'

(์˜ˆ์‹œ ๊ฒฐ๊ณผ: 45.5 MB)

Step 2: Apache ๊ฐ€์šฉ RAM ์‚ฐ์ •

์„œ๋ฒ„์˜ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ์—์„œ OS์™€ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(DB ๋“ฑ)์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

# ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ํ™•์ธ
free -m

(์˜ˆ์‹œ: 16GB ์„œ๋ฒ„์—์„œ OS/DB๊ฐ€ 6GB ์‚ฌ์šฉ ์ค‘ -> Apache์šฉ ๊ฐ€์šฉ ๋ฉ”๋ชจ๋ฆฌ 10GB (10,240 MB))

Step 3: ์ตœ์ข… ์„ค์ •๊ฐ’ ๋„์ถœ

์œ„์—์„œ ๊ตฌํ•œ ๊ฐ’์„ ๊ณต์‹์— ๋Œ€์ž…ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ณ„์‚ฐ: 10,240 MB / 45.5 MB = 225.05
  • ๊ฒฐ๋ก : ์†Œ์ˆ˜์ ์€ ๋ฒ„๋ฆฌ๊ณ  225๋ฅผ MaxRequestWorkers ๊ฐ’์œผ๋กœ ์„ ์ •ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ณด์ด์ง€ ์•Š๋Š” ๋ฒฝ: Limit ์ง€์‹œ์–ด์˜ ์ดํ•ด

MaxRequestWorkers ๊ฐ’๋งŒ ๋†’์ธ๋‹ค๊ณ  ๋์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์ƒ์œ„ ์ œํ•œ(Hard Limit) ์„ค์ •์ธ ServerLimit๊ณผ ThreadLimit ์•ˆ์—์„œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

  • ๊ทœ์น™: MaxRequestWorkers ≤ (ServerLimit × ThreadsPerChild)

๋งŒ์•ฝ ๊ณ„์‚ฐ๋œ ๊ฐ’์ด ๊ธฐ๋ณธ ํ•œ๊ณ„(๋ณดํ†ต ServerLimit 16)๋ฅผ ์ดˆ๊ณผํ•œ๋‹ค๋ฉด, ๋ฐ˜๋“œ์‹œ ์„ค์ • ํŒŒ์ผ์— ServerLimit์„ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


3. ํŠœ๋‹ ์ „๋žต: ์•ˆ์ •์„ฑ vs ํšจ์œจ์„ฑ

Event/Worker MPM์„ ์‚ฌ์šฉํ•  ๋•Œ, ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ์€ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ ServerLimit ์ฆ๊ฐ€ (ํ”„๋กœ์„ธ์Šค ↑) ThreadsPerChild ์ฆ๊ฐ€ (์Šค๋ ˆ๋“œ ↑)
์•ˆ์ •์„ฑ ๋†’์Œ (ํ•˜๋‚˜๊ฐ€ ์ฃฝ์–ด๋„ ๋‚˜๋จธ์ง€๋Š” ์ƒ์กด) ๋‚ฎ์Œ (์Šค๋ ˆ๋“œ ํ•˜๋‚˜๊ฐ€ ์ฃฝ์œผ๋ฉด ํ”„๋กœ์„ธ์Šค ์ „์ฒด ๋‹ค์šด)
๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ๋‚ฎ์Œ (๋…๋ฆฝ ๋ฉ”๋ชจ๋ฆฌ ํ•„์š”) ๋†’์Œ (๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ )
๊ถŒ์žฅ ✅ ์ ๊ทน ๊ถŒ์žฅ ⚠️ ์‹ ์ค‘ํ•œ ์ ‘๊ทผ ํ•„์š” (๋ณดํ†ต 25~64 ๊ณ ์ •)

4. ์ตœ์ข… ์„ค์ • ์˜ˆ์‹œ (httpd.conf)

์œ„์˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ(MaxRequestWorkers 1000 ๊ฐ€์ •)๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ Event MPM ์ตœ์ข… ์„ค์ • ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

<IfModule mpm_event_module>
    # 1. ์Šค๋ ˆ๋“œ ์ˆ˜๋Š” ์•ˆ์ •์ ์ธ ๊ฐ’์œผ๋กœ ๊ณ ์ • (25)
    ThreadsPerChild         25

    # 2. ํ•„์š”ํ•œ ํ”„๋กœ์„ธ์Šค ์ˆ˜ ๊ณ„์‚ฐ (1000 / 25 = 40)
    # ๊ธฐ๋ณธ๊ฐ’(16)๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์•ผ ํ•จ
    ServerLimit             40

    # 3. ๋ชฉํ‘œ ๋™์‹œ ์ฒ˜๋ฆฌ ์ˆ˜ (40 * 25 = 1000)
    MaxRequestWorkers       1000

    # 4. ๊ธฐํƒ€ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ ์˜ต์…˜
    StartServers            4
    MinSpareThreads         75
    MaxSpareThreads         250
    MaxConnectionsPerChild  0
</IfModule>
Check Point: ์„ค์ •์„ ๋งˆ์นœ ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ apachectl -t ๋˜๋Š” httpd -t ๋ช…๋ น์–ด๋กœ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žฌ๊ธฐ๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Node.js] Windows npm ์‹คํ–‰ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ: PowerShell ๋ณด์•ˆ ์ •์ฑ…(PSSecurityException) ์„ค์ • ๊ฐ€์ด๋“œ

Windows ํ™˜๊ฒฝ์—์„œ npm ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” "์ด ์‹œ์Šคํ…œ์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ..."(PSSecurityException) ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. PowerShell์˜ ์‹คํ–‰ ์ •์ฑ…(Execution Policy)์„ ์ดํ•ดํ•˜๊ณ , ๋ณด์•ˆ์„ ์œ ์ง€ํ•˜๋ฉด์„œ npm์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก RemoteSigned ์ •์ฑ…์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. ๋ฌธ์ œ ํ˜„์ƒ (Issue)

Node.js ์„ค์น˜ ํ›„ ํ„ฐ๋ฏธ๋„(VS Code ๋˜๋Š” PowerShell)์—์„œ npm ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋นจ๊ฐ„์ƒ‰ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉฐ ์‹คํ–‰์ด ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.

์—๋Ÿฌ ๋ฉ”์‹œ์ง€

npm : ์ด ์‹œ์Šคํ…œ์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ C:\Program Files\nodejs\npm.ps1 ํŒŒ์ผ์„ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์œ„์น˜ ์ค„:1 ๋ฌธ์ž:1
+ npm install
+ ~~~
    + CategoryInfo          : ๋ณด์•ˆ ์˜ค๋ฅ˜: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

2. ์›์ธ ๋ถ„์„ (Root Cause)

์ด๊ฒƒ์€ npm์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ Windows PowerShell์˜ ๋ณด์•ˆ ์ •์ฑ… ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  • Restricted (๊ธฐ๋ณธ๊ฐ’): Windows ํด๋ผ์ด์–ธํŠธ OS์˜ ๊ธฐ๋ณธ ์ •์ฑ…์œผ๋กœ, ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ(.ps1)์˜ ์‹คํ–‰์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • npm ๋ช…๋ น์–ด๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ npm.ps1 ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋‹ค ์ด ์ •์ฑ…์— ๋ง‰ํžˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

3. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (Solution)

๋ณด์•ˆ ์ •์ฑ…์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ๊ณผ ํŽธ์˜์„ฑ์˜ ๊ท ํ˜•์„ ์œ„ํ•ด RemoteSigned ์ •์ฑ…์„ ํ˜„์žฌ ์‚ฌ์šฉ์ž(CurrentUser)์—๊ฒŒ๋งŒ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Step 1: ํ˜„์žฌ ์ •์ฑ… ํ™•์ธ

PowerShell์„ ์‹คํ–‰ํ•˜๊ณ  ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Get-ExecutionPolicy

๊ฒฐ๊ณผ๊ฐ€ Restricted๋กœ ๋‚˜์˜จ๋‹ค๋ฉด ์‹คํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

Step 2: ์ •์ฑ… ๋ณ€๊ฒฝ (๊ถŒ์žฅ ์„ค์ •)

PowerShell์„ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•œ ๋’ค, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
์ •์ฑ… ์„ค๋ช…:
  • RemoteSigned: ๋กœ์ปฌ์—์„œ ์ƒ์„ฑํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰ ํ—ˆ์šฉ, ์ธํ„ฐ๋„ท์—์„œ ๋‹ค์šด๋กœ๋“œํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” ์„œ๋ช…๋œ ๊ฒƒ๋งŒ ํ—ˆ์šฉ (๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ์„ค์ •).
  • -Scope CurrentUser: ์‹œ์Šคํ…œ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ์ ์šฉํ•˜์—ฌ ๋ณด์•ˆ ๋ฆฌ์Šคํฌ ์ตœ์†Œํ™”.

๋ณ€๊ฒฝ ํ™•์ธ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜ค๋ฉด Y (์˜ˆ)๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์Šน์ธํ•ฉ๋‹ˆ๋‹ค.


4. ๋Œ€์•ˆ ๋ฐ ํŒ (Alternatives)

๋ฐฉ๋ฒ• A: ์ผํšŒ์„ฑ ํ—ˆ์šฉ (์ž„์‹œ)

์ •์ฑ…์„ ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ๋ถ€๋‹ด์Šค๋Ÿฝ๋‹ค๋ฉด, ํ˜„์žฌ ์—ด๋ ค์žˆ๋Š” ์ฐฝ์—์„œ๋งŒ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Set-ExecutionPolicy RemoteSigned -Scope Process

๋ฐฉ๋ฒ• B: Command Prompt (cmd) ์‚ฌ์šฉ

PowerShell์ด ์•„๋‹Œ ์ผ๋ฐ˜ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ(cmd)๋‚˜ Git Bash์—์„œ๋Š” ํ•ด๋‹น ๋ณด์•ˆ ์ •์ฑ…์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋ณ„๋„ ์„ค์ • ์—†์ด npm์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


5. ๊ฒ€์ฆ (Verification)

์„ค์ • ํ›„ ๋‹ค์‹œ ๋ฒ„์ „์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์—๋Ÿฌ๊ฐ€ ์‚ฌ๋ผ์กŒ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

npm --version

Next Step:
์ด์ œ npm์ด ์ •์ƒ ์ž‘๋™ํ•˜๋ฏ€๋กœ, npm install์„ ํ†ตํ•ด ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ npx create-react-app ๋“ฑ์˜ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[Apache] ๋ณด์•ˆ ์ทจ์•ฝ์  ์กฐ์น˜: ์„œ๋ฒ„ ๋ฒ„์ „ ์ •๋ณด ์ˆจ๊ธฐ๊ธฐ (ServerTokens, ServerSignature)

Apache ์›น ์„œ๋ฒ„ ์šด์˜ ์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ์ถœ๋˜๋Š” ์„œ๋ฒ„ ๋ฒ„์ „(Version), ์šด์˜์ฒด์ œ(OS), ๋ชจ๋“ˆ(Module) ์ •๋ณด๋ฅผ ์ˆจ๊ฒจ ๋ณด์•ˆ์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. httpd.conf ํŒŒ์ผ์˜ ServerTokens ๋ฐ ServerSignature ์ง€์‹œ์–ด๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ์ •๋ณด ์œ ์ถœ ์ทจ์•ฝ์ ์„ ์กฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์ทจ์•ฝ์  (Context)

๊ณต๊ฒฉ์ž๋Š” Banner Grabbing ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ๋Œ€์ƒ ์„œ๋ฒ„์˜ ๊ตฌ์ฒด์ ์ธ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ํ•ด๋‹น ๋ฒ„์ „์— ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ (CVE)์„ ์ด์šฉํ•ด ๊ณต๊ฒฉ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ฒ„ ์ •๋ณด ๋…ธ์ถœ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ ๊ฐ•ํ™”(Hardening)์˜ ์ฒซ๊ฑธ์Œ์ž…๋‹ˆ๋‹ค.


1. ํ•„์ˆ˜ ์„ค์ • (Basic Configuration)

Apache ์„ค์ • ํŒŒ์ผ(httpd.conf ๋˜๋Š” security.conf)์—์„œ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ง€์‹œ์–ด๋ฅผ ์ฐพ์•„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

1) ํ—ค๋” ์ •๋ณด ์ œํ•œ (ServerTokens)

HTTP ์‘๋‹ต ํ—ค๋”์˜ Server ํ•„๋“œ์— ํ‘œ์‹œ๋˜๋Š” ์ •๋ณด๋Ÿ‰์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ๊ฐ’ (Full): Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.0 ... (๋ชจ๋‘ ๋…ธ์ถœ)
  • ๊ถŒ์žฅ๊ฐ’ (Prod): Apache (์ œํ’ˆ๋ช…๋งŒ ๋…ธ์ถœ)
# Server ํ—ค๋”์— ์ œํ’ˆ๋ช…(Apache)๋งŒ ํ‘œ์‹œ
ServerTokens Prod

2) ์—๋Ÿฌ ํŽ˜์ด์ง€ ์„œ๋ช… ์ œ๊ฑฐ (ServerSignature)

404 Not Found, 403 Forbidden ๋“ฑ ์—๋Ÿฌ ํŽ˜์ด์ง€ ํ•˜๋‹จ์— ํ‘œ์‹œ๋˜๋Š” ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ๊ฐ’ (On): ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ•˜๋‹จ์— ์„œ๋ฒ„ ๋ฒ„์ „๊ณผ ํฌํŠธ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋จ
  • ๊ถŒ์žฅ๊ฐ’ (Off): ํ•˜๋‹จ ์„œ๋ช… ๋ผ์ธ์„ ์ œ๊ฑฐํ•จ
# ์—๋Ÿฌ ํŽ˜์ด์ง€ ํ•˜๋‹จ์— ์„œ๋ฒ„ ์ •๋ณด ์ˆจ๊น€
ServerSignature Off

2. ์‹ฌํ™” ์„ค์ • (Advanced Configuration)

์œ„์˜ ServerTokens Prod ์„ค์ •์„ ์ ์šฉํ•ด๋„ Server: Apache๋ผ๋Š” ์ •๋ณด๋Š” ์—ฌ์ „ํžˆ ๋‚จ์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ฐ์‚ฌ๋ฅผ ์œ„ํ•ด ์ด ํ—ค๋”์กฐ์ฐจ ์•„์˜ˆ ์‚ญ์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด mod_headers ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Pre-check: ์ด ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด LoadModule headers_module modules/mod_headers.so ๋ผ์ธ์˜ ์ฃผ์„์ด ํ•ด์ œ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
<IfModule mod_headers.c>
    # Server ํ—ค๋” ์ž์ฒด๋ฅผ ์‘๋‹ต์—์„œ ์ œ๊ฑฐ (๊ถŒ์žฅ)
    Header unset Server
    
    # ๋˜๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์œ„์žฅ (Security by Obscurity)
    # Header set Server "MySecureServer"
</IfModule>

3. ์„ค์ • ์ ์šฉ ๋ฐ ๊ฒ€์ฆ (Verification)

์„œ๋น„์Šค ์žฌ๊ธฐ๋™

# Syntax ๊ฒ€์‚ฌ
apachectl -t

# ์„œ๋น„์Šค ์žฌ๊ธฐ๋™ (CentOS/RHEL)
systemctl restart httpd

# ์„œ๋น„์Šค ์žฌ๊ธฐ๋™ (Ubuntu/Debian)
systemctl restart apache2

์ ์šฉ ํ™•์ธ (curl)

curl -I ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต ํ—ค๋”๋งŒ ์กฐํšŒํ•ด ๋ด…๋‹ˆ๋‹ค.

# ๋ช…๋ น ์‹คํ–‰
curl -I http://localhost

# [Before]
HTTP/1.1 200 OK
Server: Apache/2.4.6 (CentOS) ... (์ทจ์•ฝ)

# [After 1 - Prod ์ ์šฉ]
Server: Apache

# [After 2 - Header unset ์ ์šฉ]
(Server ํ—ค๋”๊ฐ€ ์•„์˜ˆ ๋ณด์ด์ง€ ์•Š์Œ)

Next Step:
์„œ๋ฒ„ ์ •๋ณด ์ˆจ๊น€ ์กฐ์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด, ์ถ”๊ฐ€์ ์ธ ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด X-Content-Type-Options, X-Frame-Options ๋“ฑ ๋ณด์•ˆ ํ—ค๋” ์ ์šฉ์„ ๊ฒ€ํ† ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[JBoss EAP 7] ๋ฐ์ดํ„ฐ์†Œ์Šค ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™” ์™„๋ฒฝ ๊ฐ€์ด๋“œ: Password Vault ๊ตฌ์„ฑ ๋ฐ ์ ์šฉ (Windows/Linux)

JBoss EAP 7.x ํ™˜๊ฒฝ์—์„œ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์†Œ์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด Password Vault๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Windows์™€ Linux ํ™˜๊ฒฝ, ๊ทธ๋ฆฌ๊ณ  Standalone๊ณผ Domain ๋ชจ๋“œ ๊ฐ๊ฐ์— ๋Œ€ํ•œ ์„ค์ •๋ฒ•์„ ํฌ๊ด„ํ•˜๋ฉฐ, KeyStore ์ƒ์„ฑ๋ถ€ํ„ฐ VAULT ๋ฌธ์ž์—ด ์ ์šฉ๊นŒ์ง€์˜ ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

1. ํ”„๋กœ์„ธ์Šค ๊ฐœ์š” (Process Overview)

Vault ๊ตฌ์„ฑ์€ ํฌ๊ฒŒ 4๋‹จ๊ณ„๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

  1. KeyStore ์ƒ์„ฑ: ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ์ €์žฅํ•  ๋ฌผ๋ฆฌ์  ํŒŒ์ผ(.keystore) ์ƒ์„ฑ
  2. Vault ์ดˆ๊ธฐํ™” ๋ฐ ์•”ํ˜ธํ™”: ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ณ  JBoss ์„ค์ •์— ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ƒ์„ฑ
  3. JBoss Vault ์„ค์ •: ์ƒ์„ฑ๋œ KeyStore์™€ JBoss๋ฅผ ์—ฐ๋™ (standalone.xml ๋˜๋Š” host.xml)
  4. ๋ฐ์ดํ„ฐ์†Œ์Šค ์ ์šฉ: ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด(${VAULT::...})๋กœ ๊ต์ฒด

2. KeyStore ์ƒ์„ฑ (Generate KeyStore)

Java์˜ keytool์„ ์‚ฌ์šฉํ•˜์—ฌ JCEKS ํ˜•์‹์˜ ํ‚ค์Šคํ† ์–ด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Windows ํ™˜๊ฒฝ

keytool.exe -genseckey ^
  -alias "vault" ^
  -storetype "jceks" ^
  -keyalg "AES" ^
  -keysize "128" ^
  -storepass "passw0rd" ^
  -keypass "passw0rd" ^
  -validity "7300" ^
  -keystore "D:\app\was\JBoss\vault\vault.keystore"

Linux ํ™˜๊ฒฝ

./keytool -genseckey \
  -alias "vault" \
  -storetype "jceks" \
  -keyalg "AES" \
  -keysize "128" \
  -storepass "passw0rd" \
  -keypass "passw0rd" \
  -validity "7300" \
  -keystore "/app/was/JBoss/vault/vault.keystore"

3. ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ์‹คํ–‰ (Vault Tool)

JBoss `bin` ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” vault ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ DB ํŒจ์Šค์›Œ๋“œ๋ฅผ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

Windows (vault.bat)

vault.bat --keystore "D:\app\was\JBoss\vault\vault.keystore" ^
  --keystore-password "passw0rd" ^
  --alias "vault" ^
  --vault-block "vb" ^
  --attribute "dbpw" ^
  --sec-attr "RealDBPassword!" ^
  --enc-dir "D:\app\was\JBoss\vault" ^
  --iteration "44" ^
  --salt "JBo72ssv"

Linux (vault.sh)

./vault.sh --keystore "/app/was/JBoss/vault/vault.keystore" \
  --keystore-password "passw0rd" \
  --alias "vault" \
  --vault-block "vb" \
  --attribute "dbpw" \
  --sec-attr "RealDBPassword!" \
  --enc-dir "/app/was/JBoss/vault" \
  --iteration "44" \
  --salt "JBo72ssv"
์ค‘์š” (Result Check):
๋ช…๋ น์–ด ์‹คํ–‰ ๊ฒฐ๊ณผ์—์„œ ์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ๊ฐ’์„ ๋ฐ˜๋“œ์‹œ ๊ธฐ๋กํ•ด ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
1. Vault Configuration: KEYSTORE_PASSWORD ๊ฐ’ (์˜ˆ: MASK-1234abcd...)
2. Vault Block: ์‹ค์ œ ์‚ฌ์šฉ๋  ์•”ํ˜ธํ™” ๋ฌธ์ž์—ด (์˜ˆ: ${VAULT::vb::dbpw::1})

4. JBoss Vault ๊ตฌ์„ฑ ๋“ฑ๋ก (Configuration)

JBoss๊ฐ€ ์œ„์—์„œ ๋งŒ๋“  KeyStore๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. XML์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ CLI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Standalone Mode (standalone.xml)

<vault> ์„น์…˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. (์ผ๋ฐ˜์ ์œผ๋กœ <extensions> ๋’ค์ชฝ)

<vault>
    <vault-option name="KEYSTORE_URL" value="D:\app\was\JBoss\vault\vault.keystore"/>
    <vault-option name="KEYSTORE_PASSWORD" value="MASK-xxxx"/> <!-- Vault ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ’ -->
    <vault-option name="KEYSTORE_ALIAS" value="vault"/>
    <vault-option name="SALT" value="JBo72ssv"/>
    <vault-option name="ITERATION_COUNT" value="44"/>
    <vault-option name="ENC_FILE_DIR" value="D:\app\was\JBoss\vault\"/>
</vault>

Domain Mode (host.xml ๊ถŒ์žฅ)

๋„๋ฉ”์ธ ๋ชจ๋“œ์—์„œ๋Š” ๋ฌผ๋ฆฌ์  ํŒŒ์ผ ๊ฒฝ๋กœ(KeyStore ์œ„์น˜)๊ฐ€ ์„œ๋ฒ„๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ ์„œ๋ฒ„์˜ host.xml์— ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

<!-- host.xml์˜ <management> ๋˜๋Š” <vault> ์˜์—ญ -->
<vault>
    <vault-option name="KEYSTORE_URL" value="/app/was/JBoss/vault/vault.keystore"/>
    <vault-option name="KEYSTORE_PASSWORD" value="MASK-xxxx"/>
    <vault-option name="KEYSTORE_ALIAS" value="vault"/>
    <vault-option name="SALT" value="JBo72ssv"/>
    <vault-option name="ITERATION_COUNT" value="44"/>
    <vault-option name="ENC_FILE_DIR" value="/app/was/JBoss/vault/"/>
</vault>

5. ๋ฐ์ดํ„ฐ์†Œ์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ ์ ์šฉ

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ • ํŒŒ์ผ(standalone.xml ๋˜๋Š” domain.xml)์—์„œ ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ Vault ๋ฌธ์ž์—ด๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

<datasource jndi-name="java:jboss/datasources/ExampleDS" ...>
    ...
    <security>
        <user-name>dbuser</user-name>
        <!-- ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด ์ ์šฉ -->
        <password>${VAULT::vb::dbpw::1}</password>
    </security>
</datasource>

Next Step:
์„ค์ •์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด JBoss๋ฅผ ์žฌ๊ธฐ๋™ํ•˜๊ณ  ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ Test Connection์„ ์ˆ˜ํ–‰ํ•˜์—ฌ DB ์—ฐ๊ฒฐ์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

[JBoss EAP 6] ๋„๋ฉ”์ธ ๋ชจ๋“œ ๋ณด์•ˆ ๊ฐ•ํ™”: Vault๋ฅผ ์ด์šฉํ•œ Datasource ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™” ๋ฐ ๋ฌด์ค‘๋‹จ ์ ์šฉ ์ „๋žต

JBoss EAP 6.4 ๋„๋ฉ”์ธ ๋ชจ๋“œ(Domain Mode)์—์„œ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์†Œ์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด Vault๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. host.xml๊ณผ domain.xml์˜ ์„ค์ • ๋ถ„๋ฆฌ ์›์น™์„ ์ดํ•ดํ•˜๊ณ , ์ด์ค‘ํ™”๋œ ํ™˜๊ฒฝ์—์„œ ์„œ๋น„์Šค ์ค‘๋‹จ ์—†์ด ์ ์šฉํ•˜๋Š” ์ˆœ์ฐจ์  ๋ฐฐํฌ ์ „๋žต์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์•„ํ‚คํ…์ฒ˜ (Context)

๋ณด์•ˆ ๊ฐ์‚ฌ ์š”๊ฑด ์ถฉ์กฑ์„ ์œ„ํ•ด DB ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™”๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ๋ชจ๋“œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค์ • ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • host.xml: ๋ฌผ๋ฆฌ์ ์ธ Keystore ํŒŒ์ผ์˜ ์œ„์น˜์™€ ์•”ํ˜ธํ™” ํ‚ค ํ•ด๋… ์„ค์ • (Vault ์„ ์–ธ)
  • domain.xml: ์‹ค์ œ ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ • (Vault ์ฐธ์กฐ)

1. Vault ํ™˜๊ฒฝ ์ค€๋น„ (Keystore ์ƒ์„ฑ)

์•”ํ˜ธํ™” ํ‚ค๋ฅผ ์ €์žฅํ•  Java Keystore๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. JDK์˜ keytool์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

# Keystore ์ƒ์„ฑ (์•Œ๊ณ ๋ฆฌ์ฆ˜: DESede ๋˜๋Š” AES)
keytool -genkey -alias vault -keyalg DESede -keystore vault.keystore -keysize 168 -storepass [ํ‚ค์Šคํ† ์–ด_๋น„๋ฐ€๋ฒˆํ˜ธ] -validity 3650
Tip: ์ƒ์„ฑ๋œ vault.keystore ํŒŒ์ผ์€ ๋งˆ์Šคํ„ฐ(Master)์™€ ์Šฌ๋ ˆ์ด๋ธŒ(Slave) ์„œ๋ฒ„ ๋ชจ๋‘ ๋™์ผํ•œ ๊ฒฝ๋กœ(์˜ˆ: EAP_HOME/vault/)์— ๋ณต์‚ฌํ•ด ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. Vault ์ดˆ๊ธฐํ™” ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”

JBoss์—์„œ ์ œ๊ณตํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Vault๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ์‹ค์ œ DB ํŒจ์Šค์›Œ๋“œ๋ฅผ ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ™”ํ˜• ๋ชจ๋“œ ์‹คํ–‰ (Interactive)

$JBOSS_HOME/bin/vault.sh

์œ„ ๋ช…๋ น ์‹คํ–‰ ํ›„ ์˜ต์…˜ 0 (Store a secured attribute)์„ ์„ ํƒํ•˜์—ฌ ์ง„ํ–‰ํ•˜๊ฑฐ๋‚˜, ์•„๋ž˜์™€ ๊ฐ™์ด CLI ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

# CLI ํŒŒ๋ผ๋ฏธํ„ฐ ์˜ˆ์‹œ
$JBOSS_HOME/bin/vault.sh \
--keystore vault.keystore \
--keystore-password [ํ‚ค์Šคํ† ์–ด_๋น„๋ฐ€๋ฒˆํ˜ธ] \
--alias vault \
--vault-block ds_vault \
--attribute db_password \
--sec-attr [์‹ค์ œ_DB_๋น„๋ฐ€๋ฒˆํ˜ธ] \
--enc-dir /path/to/vault/ \
--iteration 120 \
--salt 1234abcd

๊ฒฐ๊ณผ ํ™•์ธ: ์ถœ๋ ฅ๋˜๋Š” VAULT::ds_vault::db_password::1 ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด๊ณผ, ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” XML ์„ค์ • ๋ธ”๋ก์„ ๋ณต์‚ฌํ•ด ๋‘ก๋‹ˆ๋‹ค.


3. host.xml ์„ค์ • (Vault ์„ ์–ธ)

๋ฌผ๋ฆฌ์ ์ธ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ธ์‹ํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ํ˜ธ์ŠคํŠธ ์ปจํŠธ๋กค๋Ÿฌ(Master, Slave)์˜ host.xml ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

<!-- host.xml์˜ <management> ์„น์…˜ ๋‚ด, ๋˜๋Š” <vault> ์„น์…˜ -->
<vault>
    <vault-option name="KEYSTORE_URL" value="/path/to/vault/vault.keystore"/>
    <vault-option name="KEYSTORE_PASSWORD" value="MASK-..."/> <!-- ๋งˆ์Šคํ‚น๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ -->
    <vault-option name="KEYSTORE_ALIAS" value="vault"/>
    <vault-option name="SALT" value="1234abcd"/>
    <vault-option name="ITERATION_COUNT" value="120"/>
    <vault-option name="ENC_FILE_DIR" value="/path/to/vault/" />
</vault>

4. domain.xml ์„ค์ • (Datasource ์ ์šฉ)

์ด์ œ ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ์˜ domain.xml์—์„œ ๋ฐ์ดํ„ฐ์†Œ์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถ€๋ถ„์„ ์œ„์—์„œ ์ƒ์„ฑํ•œ Vault ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

<datasource ...>
    <security>
        <user-name>dbuser</user-name>
        <password>${VAULT::ds_vault::db_password::1}</password>
    </security>
</datasource>

5. ์šด์˜ ํ™˜๊ฒฝ ์ ์šฉ ์ „๋žต (Deployment Strategy)

์ด์ค‘ํ™”(HA)๋œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์„œ๋น„์Šค ์ค‘๋‹จ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, host.xml ์„ค์ •๊ณผ domain.xml ์„ค์ •์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ ์šฉํ•˜๋Š” ์ „๋žต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Scenario A: ๋ฌด์ค‘๋‹จ ์ˆœ์ฐจ ์ ์šฉ (Rolling Update)

Host Controller(HC) ์„ค์ •์ธ host.xml์€ ์žฌ๊ธฐ๋™์ด ํ•„์š”ํ•˜์ง€๋งŒ, domain.xml ๋ณ€๊ฒฝ์€ ๋ฆฌ๋กœ๋“œ(Reload)๋กœ ๋ฐ˜์˜๋  ์ˆ˜ ์žˆ์Œ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. Slave ์„œ๋ฒ„(Server2) ์ž‘์—…:
    • Slave HC ์ค‘์ง€
    • Slave host.xml์— Vault ์„ค์ • ์ถ”๊ฐ€ ๋ฐ vault.keystore ํŒŒ์ผ ๋ฐฐํฌ
    • Slave HC ์žฌ๊ธฐ๋™ (์ด๋•Œ Server2 ์ธ์Šคํ„ด์Šค๋“ค๋„ ์žฌ๊ธฐ๋™๋จ)
  2. Master ์„œ๋ฒ„(Server1) ์ž‘์—…:
    • Master HC ์ค‘์ง€ (๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ ์ค‘์ง€)
    • Master host.xml์— Vault ์„ค์ • ์ถ”๊ฐ€ ๋ฐ vault.keystore ํŒŒ์ผ ๋ฐฐํฌ
    • Master HC ์žฌ๊ธฐ๋™
  3. Datasource ๋ณ€๊ฒฝ:
    • Master๊ฐ€ ๊ธฐ๋™๋œ ์ƒํƒœ์—์„œ domain.xml์˜ ๋ฐ์ดํ„ฐ์†Œ์Šค ํŒจ์Šค์›Œ๋“œ๋ฅผ ${VAULT::...}๋กœ ๋ณ€๊ฒฝ
    • JBoss CLI ๋˜๋Š” ์ฝ˜์†”์—์„œ Datasource Disable/Enable ์ˆ˜ํ–‰ (๋˜๋Š” reload)

Scenario B: ์ „์ฒด ์ค‘๋‹จ ํ›„ ์ ์šฉ (Cold Restart)

๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ณ  ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์œ ์ง€๋ณด์ˆ˜ ์‹œ๊ฐ„(Maintenance Window)์ด ํ™•๋ณด๋˜์—ˆ์„ ๋•Œ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  JBoss ํ”„๋กœ์„ธ์Šค(Master/Slave) ์ข…๋ฃŒ
  2. ๋ชจ๋“  ์„œ๋ฒ„์˜ host.xml ์ˆ˜์ • ๋ฐ ํ‚ค์Šคํ† ์–ด ๋ฐฐํฌ
  3. Master ์„œ๋ฒ„์˜ domain.xml ์ˆ˜์ •
  4. Master ๊ธฐ๋™ → Slave ๊ธฐ๋™ ์ˆœ์„œ๋กœ ์ „์ฒด ์žฌ์‹œ์ž‘

6. ๊ฒ€์ฆ (Verification)

  • ์„œ๋ฒ„ ๊ธฐ๋™ ๋กœ๊ทธ(server.log)์— Vault ๊ด€๋ จ ์—๋Ÿฌ(PBOX000...)๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ Datasource์˜ Test Connection์„ ์ˆ˜ํ–‰ํ•˜์—ฌ DB ์—ฐ๊ฒฐ์ด ์ •์ƒ์ ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

[WebSphere Liberty] securityUtility๋กœ SSL ์ธ์ฆ์„œ ์ƒ์„ฑ ๋ฐ AES ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™” ์„ค์ • ๊ฐ€์ด๋“œ

WebSphere Liberty์˜ securityUtility ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์ฒด ์„œ๋ช…๋œ(Self-Signed) SSL ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ณด์•ˆ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด Keystore ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ AES๋กœ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์‹œ๋‚˜๋ฆฌ์˜ค (Context)

Liberty ์„œ๋ฒ„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐœ๋ฐœ ํŽธ์˜๋ฅผ ์œ„ํ•ด SSL ์„ค์ •์„ ์ž๋™ํ™”ํ•˜์ง€๋งŒ, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ช…์‹œ์ ์ธ ์ธ์ฆ์„œ ๊ด€๋ฆฌ์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณด์•ˆ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. securityUtility๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์ฆ์„œ ์ƒ์„ฑ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”(Encoding)๋ฅผ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Test Environment

  • Middleware: WebSphere Liberty Profile (WLP)
  • Server Name: s11, s12

1. SSL ์ธ์ฆ์„œ ์ƒ์„ฑ ๋ฐ ์•”ํ˜ธํ™” (Create Certificate)

securityUtility createSSLCertificate ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค์Šคํ† ์–ด(PKCS12)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ --passwordEncoding=aes ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ • ํŒŒ์ผ์— ๋“ค์–ด๊ฐˆ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด ๊ตฌ๋ฌธ

# ๊ตฌ๋ฌธ: securityUtility createSSLCertificate --server=[์„œ๋ฒ„๋ช…] --password=[ํ‚คํŒจ์Šค์›Œ๋“œ] --validity=[์œ ํšจ๊ธฐ๊ฐ„์ผ์ˆ˜] --passwordEncoding=aes --passwordKey=[์•”ํ˜ธํ™”ํ‚ค]

cd $WLP_HOME/bin
./securityUtility createSSLCertificate --server=s11 --password=passw0rd --validity=7300 --passwordEncoding=aes --passwordKey=passw0rd

์‹คํ–‰ ๊ฒฐ๊ณผ

ํ‚ค ์ €์žฅ์†Œ /sw/was/WebSphere/wlp/usr/servers/s11/resources/security/key.p12์„(๋ฅผ) ์ž‘์„ฑํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์„œ๋ฒ„ s11์— ๋Œ€ํ•œ SSL ์ธ์ฆ์„œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. 
์ด ์ธ์ฆ์„œ๋Š” CN=testwas11,OU=s11์„(๋ฅผ) ์‚ฌ์šฉํ•˜์—ฌ SubjectDN์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
Tip: ์—ฌ๊ธฐ์„œ ์ƒ์„ฑ๋œ ํ‚ค์Šคํ† ์–ด ํŒŒ์ผ(key.p12)์€ usr/servers/[์„œ๋ฒ„๋ช…]/resources/security/ ๊ฒฝ๋กœ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

2. ์„œ๋ฒ„ ์„ค์ • ์ ์šฉ (server.xml)

์œ„์—์„œ ์ƒ์„ฑ๋œ ์ธ์ฆ์„œ๋ฅผ ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•˜๋„๋ก server.xml์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถ€๋ถ„์— {aes}... ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<server description="SSL Server">

    <!-- 1. SSL ๊ธฐ๋Šฅ ํ™œ์„ฑํ™” -->
    <featureManager>
        <feature>transportSecurity-1.0</feature>
    </featureManager>

    <!-- 2. Keystore ์ •์˜ (๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์•”ํ˜ธํ™”๋œ ๊ฐ’ ์‚ฌ์šฉ) -->
    <keyStore id="defaultKeyStore" 
              location="key.p12"
              password="{aes}AJS+VEek/Fgo/zp46z8cuIUMTbnMM7sJVmPPbT49n4s6" />

</server>

3. ์•”ํ˜ธํ™” ํ‚ค ๋“ฑ๋ก (bootstrap.properties)

server.xml์— ์ ํžŒ {aes} ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„œ๋ฒ„๊ฐ€ ๋ณตํ˜ธํ™”ํ•˜๋ ค๋ฉด, ์•”ํ˜ธํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ–ˆ๋˜ Key๋ฅผ ์„œ๋ฒ„์— ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ bootstrap.properties ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ํŒŒ์ผ ์œ„์น˜: usr/servers/[์„œ๋ฒ„๋ช…]/bootstrap.properties
# securityUtility ์‹คํ–‰ ์‹œ --passwordKey ์˜ต์…˜์— ๋„ฃ์—ˆ๋˜ ๊ฐ’
wlp.password.encryption.key=passw0rd
์ฃผ์˜: ์ด ์„ค์ •์ด ๋ˆ„๋ฝ๋˜๋ฉด ์„œ๋ฒ„ ๊ธฐ๋™ ์‹œ CWWKS1704E: ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

4. ์ธ์ฆ์„œ ๊ฒ€์ฆ (Verification)

์ƒ์„ฑ๋œ ํ‚ค์Šคํ† ์–ด ํŒŒ์ผ์ด ์ •์ƒ์ ์ธ์ง€, ์œ ํšจ๊ธฐ๊ฐ„์€ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด JDK์— ํฌํ•จ๋œ keytool ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ ๋ช…๋ น์–ด

# keytool -list -v -keystore [ํŒŒ์ผ๊ฒฝ๋กœ] -storetype PKCS12 -storepass [๋น„๋ฐ€๋ฒˆํ˜ธ]
./keytool -list -v -keystore /sw/was/WebSphere/wlp/usr/servers/s12/resources/security/key.p12 -storetype PKCS12 -storepass passw0rd

์ถœ๋ ฅ ๊ฒฐ๊ณผ ๋ถ„์„

ํ‚ค ์ €์žฅ์†Œ ์œ ํ˜•: PKCS12
ํ‚ค ์ €์žฅ์†Œ ์ œ๊ณต์ž: SUN

๋ณ„์นญ ์ด๋ฆ„: default
์ƒ์„ฑ ๋‚ ์งœ: 2024. 6. 12.
ํ•ญ๋ชฉ ์œ ํ˜•: PrivateKeyEntry
์ธ์ฆ์„œ ์ฒด์ธ ๊ธธ์ด: 2

# ์œ ํšจ๊ธฐ๊ฐ„ ํ™•์ธ
์ ํ•ฉํ•œ ์‹œ์ž‘ ๋‚ ์งœ: Wed Jun 12 16:47:57 KST 2024 
์ข…๋ฃŒ ๋‚ ์งœ: Tue Jun 07 16:47:57 KST 2044 (์•ฝ 20๋…„)

# ์†Œ์œ ์ž ๋ฐ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ™•์ธ
์†Œ์œ ์ž: CN=testwas11, OU=s12, O=ibm, C=us
์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ฆ„: SHA256withRSA
์ฃผ์ฒด ๊ณต์šฉ ํ‚ค ์•Œ๊ณ ๋ฆฌ์ฆ˜: 2048๋น„ํŠธ RSA ํ‚ค

Next Step:
์ž์ฒด ์„œ๋ช… ์ธ์ฆ์„œ(Self-Signed)๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” CSR์„ ์ƒ์„ฑํ•˜์—ฌ ๊ณต์ธ ์ธ์ฆ๊ธฐ๊ด€(CA)์˜ ์„œ๋ช…์„ ๋ฐ›์€ ํ›„ keytool -import ๋ช…๋ น์–ด๋กœ ๊ต์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[JBoss EAP 7] ๋ณด์•ˆ ํ—ค๋” ์ˆจ๊ธฐ๊ธฐ: Server ๋ฐ X-Powered-By ์ •๋ณด ๋…ธ์ถœ ๋ฐฉ์ง€ (Undertow Filter ์„ค์ •)

JBoss EAP 7.4 (Undertow)์˜ HTTP ์‘๋‹ต ํ—ค๋”์— ๋…ธ์ถœ๋˜๋Š” ์„œ๋ฒ„ ๋ฒ„์ „ ์ •๋ณด(Server: JBoss-EAP/7, X-Powered-By: JSP/2.3)๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ณด์•ˆ์„ฑ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. CLI ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•œ JSP ์„ค์ • ๋ณ€๊ฒฝ๊ณผ ํ•„ํ„ฐ(Filter) ์ ์šฉ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

1. ๋ฌธ์ œ ํ˜„์ƒ (Issue)

๊ธฐ๋ณธ ์„ค์ • ์ƒํƒœ์—์„œ JBoss EAP 7.4๋Š” ์‘๋‹ต ํ—ค๋”์— ๊ตฌ์ฒด์ ์ธ ๋ฏธ๋“ค์›จ์–ด ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต๊ฒฉ์ž์—๊ฒŒ ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋‹จ์„œ๊ฐ€ ๋˜๋ฏ€๋กœ ๋ณด์•ˆ ์ทจ์•ฝ์ ์œผ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

๋…ธ์ถœ๋˜๋Š” ํ—ค๋” ์˜ˆ์‹œ

HTTP/1.1 200 OK
X-Powered-By: Undertow/1
X-Powered-By: JSP/2.3
Server: JBoss-EAP/7
...

2. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (Resolution Plan)

์กฐ์น˜๋Š” ํฌ๊ฒŒ ๋‘ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ① JSP ์—”์ง„์ด ์ž๋™์œผ๋กœ ๋ถ™์ด๋Š” ํ—ค๋” ๋น„ํ™œ์„ฑํ™”, ② Undertow ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Server ํ—ค๋” ๋ฎ์–ด์“ฐ๊ธฐ์ž…๋‹ˆ๋‹ค.

Step 1: X-Powered-By (JSP) ๋น„ํ™œ์„ฑํ™”

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์„ค์ •์—์„œ JSP ์—”์ง„์ด ํ•ด๋‹น ํ—ค๋”๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

[JBoss CLI ๋ช…๋ น์–ด]

# JSP ์„ค์ •์˜ x-powered-by ์†์„ฑ์„ false๋กœ ๋ณ€๊ฒฝ
/subsystem=undertow/servlet-container=default/setting=jsp:write-attribute(name=x-powered-by,value=false)

# ์„ค์ • ์ ์šฉ์„ ์œ„ํ•œ ๋ฆฌ๋กœ๋“œ (ํ•„์š”์‹œ)
reload
ํ™•์ธ: ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ๋„ Configuration > Subsystems > Undertow > Servlet Container > JSP ํ•ญ๋ชฉ์—์„œ X-Powered-By ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ํ•ด์ œ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Step 2: Server ํ—ค๋” ๋ณ€๊ฒฝ/์‚ญ์ œ (Undertow Filter)

Server ํ—ค๋”๋Š” ์—”์ง„ ๋ ˆ๋ฒจ์—์„œ ๋ถ™๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ์•„์˜ˆ ์‚ญ์ œ๊ฐ€ ์–ด๋ ต๋‹ค๋ฉด, ํ•„ํ„ฐ(Filter)๋ฅผ ํ†ตํ•ด ๋ฌด์˜๋ฏธํ•œ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์“ฐ๋Š”(Override) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

[JBoss CLI ๋ช…๋ น์–ด]

# 1. ํ—ค๋” ๋ณ€๊ฒฝ์šฉ ํ•„ํ„ฐ ์ƒ์„ฑ (์ด๋ฆ„: server-header, ๊ฐ’: "Apache" ๋˜๋Š” ๋นˆ ๊ฐ’)
/subsystem=undertow/configuration=filter/response-header=server-header:add(header-name="Server", header-value="Apache")

# 2. X-Powered-By (Undertow) ํ—ค๋” ์ œ๊ฑฐ ํ•„ํ„ฐ ์ƒ์„ฑ (ํ•„์š” ์‹œ)
/subsystem=undertow/configuration=filter/response-header=x-powered-by-header:add(header-name="X-Powered-By", header-value="Unknown")

# 3. ์ƒ์„ฑํ•œ ํ•„ํ„ฐ๋ฅผ ๊ธฐ๋ณธ ํ˜ธ์ŠคํŠธ(default-host)์— ์ ์šฉ
/subsystem=undertow/server=default-server/host=default-host/filter-ref=server-header:add
/subsystem=undertow/server=default-server/host=default-host/filter-ref=x-powered-by-header:add
Tip: header-value์— ๋นˆ ๊ฐ’("")์„ ๋„ฃ๊ฑฐ๋‚˜ ์ผ๋ฐ˜์ ์ธ ์›น ์„œ๋ฒ„ ์ด๋ฆ„("Webserver")์„ ๋„ฃ์–ด ๊ณต๊ฒฉ์ž์—๊ฒŒ ํ˜ผ๋™์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์กฐ์น˜ ๊ฒฐ๊ณผ ํ™•์ธ (Verification)

์„ค์ • ์ ์šฉ ํ›„ curl ๋ช…๋ น์–ด๋‚˜ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์‘๋‹ต ํ—ค๋”๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์ „ํ›„ ๋น„๊ต

ํ—ค๋”(Header) ๋ณ€๊ฒฝ ์ „ (Before) ๋ณ€๊ฒฝ ํ›„ (After)
Server JBoss-EAP/7 Apache (์„ค์ •ํ•œ ๊ฐ’)
X-Powered-By JSP/2.3, Undertow/1 (์‚ญ์ œ๋จ) ๋˜๋Š” Unknown
Security Header Verification

[๊ทธ๋ฆผ] ์กฐ์น˜ ํ›„ ํ—ค๋” ์ •๋ณด ๋…ธ์ถœ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ