[IHS] SSL/TLS ๋ณด์•ˆ ๊ฐ•ํ™”: Protocol ๋น„ํ™œ์„ฑํ™” ๋ฐ Cipher Suite ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ์„ค์ •

IBM HTTP Server(IHS)๋Š” Apache ๊ธฐ๋ฐ˜์ด์ง€๋งŒ, SSL ๋ชจ๋“ˆ์€ ๋ณ„๋„์˜ mod_ibm_ssl์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ Apache(mod_ssl)์™€ ํ”„๋กœํ† ์ฝœ ์„ค์ • ๋ฌธ๋ฒ•์ด ์ƒ์ดํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์„œ๋ฒ„ ๊ฐ„์˜ ์„ค์ • ์ฐจ์ด๋ฅผ ๋น„๊ตํ•˜๊ณ , IHS v8.5 ํ™˜๊ฒฝ์—์„œ์˜ ๋ณด์•ˆ ๊ฐ•ํ™” ์„ค์ •์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

[Image of SSL TLS handshake process]

1. Apache vs IHS ์„ค์ • ์ฐจ์ด์  (Comparison)

๋‘ ์›น ์„œ๋ฒ„๋Š” SSL/TLS ํ•ธ๋“œ์‰์ดํฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—”์ง„๊ณผ ๋ชจ๋“ˆ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, httpd.conf์— ์ž‘์„ฑํ•˜๋Š” ์ง€์‹œ์–ด(Directive)๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด๋‚˜ ์šด์˜ ์‹œ ํ˜ผ๋™ํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ Apache HTTP Server (Community) IBM HTTP Server (IHS)
์‚ฌ์šฉ ๋ชจ๋“ˆ mod_ssl (OpenSSL ๊ธฐ๋ฐ˜) mod_ibm_ssl (IBM GSKit ๊ธฐ๋ฐ˜)
ํ”„๋กœํ† ์ฝœ ์„ค์ • SSLProtocol (ํ•œ ์ค„๋กœ ์ œ์–ด) SSLProtocolDisable
SSLProtocolEnable (๊ฐœ๋ณ„ ์ œ์–ด)
Cipher ์„ค์ • SSLCipherSuite SSLCipherSpec

์„ค์ • ๋ฌธ๋ฒ• ๋น„๊ต ์˜ˆ์‹œ

Apache (mod_ssl)

# ๋ชจ๋“  ํ”„๋กœํ† ์ฝœ์—์„œ SSLv2, SSLv3 ์ œ์™ธ
SSLProtocol all -SSLv2 -SSLv3

# Cipher Suite ์„ค์ • (OpenSSL ๋ช…๋ช…๊ทœ์น™ ์‚ฌ์šฉ)
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5

IHS (mod_ibm_ssl)

# ๊ฐœ๋ณ„์ ์œผ๋กœ ํ™œ์„ฑ/๋น„ํ™œ์„ฑ ์ง€์ •
SSLProtocolDisable SSLv2
SSLProtocolDisable SSLv3
SSLProtocolEnable TLSv12

# Cipher Spec ์„ค์ • (Long Name ์‚ฌ์šฉ, ์ดˆ๊ธฐํ™” ํ›„ ์ถ”๊ฐ€ ๋ฐฉ์‹ ๊ถŒ์žฅ)
SSLCipherSpec ALL NONE
SSLCipherSpec ALL +TLS_RSA_WITH_AES_128_CBC_SHA

2. IHS ๋ณด์•ˆ ์„ค์ • ๊ฐ€์ด๋“œ (Configuration)

IHS v8.5 ์ด์ƒ ํ™˜๊ฒฝ์—์„œ ์ทจ์•ฝํ•œ ํ”„๋กœํ† ์ฝœ์„ ์ฐจ๋‹จํ•˜๊ณ  ์•ˆ์ „ํ•œ Cipher๋งŒ ํ—ˆ์šฉํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.

LoadModule ibm_ssl_module modules/mod_ibm_ssl.so
Listen 443

# IP ๊ธฐ๋ฐ˜ ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ ํ™œ์„ฑํ™” (IHS 8.5 ์ดํ•˜ ํ•„์ˆ˜)
NameVirtualHost *:443

<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot /app/EAR/SSL
    
    # SSL ์—”์ง„ ํ™œ์„ฑํ™”
    SSLEnable
    
    # 1. ์ทจ์•ฝ ํ”„๋กœํ† ์ฝœ ๋ช…์‹œ์  ๋น„ํ™œ์„ฑํ™”
    # (TLS 1.0, 1.1๋„ ๋ณด์•ˆ ์ •์ฑ…์— ๋”ฐ๋ผ ์ฐจ๋‹จ ๊ณ ๋ ค)
    SSLProtocolDisable SSLv2
    SSLProtocolDisable SSLv3
    SSLProtocolDisable TLSv10
    SSLProtocolDisable TLSv11
    
    # 2. ์•ˆ์ „ํ•œ ํ”„๋กœํ† ์ฝœ ํ™œ์„ฑํ™”
    SSLProtocolEnable TLSv12
    
    # 3. Cipher Suite ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ์„ค์ •
    # ์ค‘์š”: 'ALL NONE'์œผ๋กœ ๊ธฐ์กด ์„ค์ • ์ดˆ๊ธฐํ™”
    SSLCipherSpec ALL NONE
    
    # Forward Secrecy(PFS)๋ฅผ ์ง€์›ํ•˜๋Š” ECDHE ๊ณ„์—ด ์šฐ์„  ๋ฐฐ์น˜
    SSLCipherSpec ALL +TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 +TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
    SSLCipherSpec ALL +TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 +TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
    
    # ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•œ RSA/AES ๊ณ„์—ด ์ถ”๊ฐ€
    SSLCipherSpec ALL +TLS_RSA_WITH_AES_256_CBC_SHA +TLS_RSA_WITH_AES_128_CBC_SHA
</VirtualHost>

KeyFile /SW/web/HTTPServer/key/key.kdb
SSLDisable

3. ์„ค์ • ๊ฒ€์ฆ (Verification)

์„ค์ • ์ ์šฉ ํ›„ IHS๋ฅผ ์žฌ๊ธฐ๋™ํ•˜๊ธฐ ์ „, ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ ์šฉ๋œ Cipher ๋ชฉ๋ก์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ ์šฉ๋œ Cipher ํ™•์ธ

cd [IHS_HOME]/bin
./apachectl -t -D DUMP_SSL_CONFIG

์ ‘์† ํ…Œ์ŠคํŠธ (nmap)

์™ธ๋ถ€์—์„œ ์Šค์บ”ํ•˜์—ฌ ์ทจ์•ฝํ•œ ํ”„๋กœํ† ์ฝœ(SSLv3 ๋“ฑ)์ด ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”์ง€ ๊ต์ฐจ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

nmap --script ssl-enum-ciphers -p 443 [Target_IP]

Next Step:
IHS 9.0 (Apache 2.4 ๊ธฐ๋ฐ˜)์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๊ฒฝ์šฐ, SSLProtocol ์ง€์‹œ์–ด๋ฅผ Apache ์Šคํƒ€์ผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์ง€๋งŒ, ๊ธฐ์กด IHS ์„ค์ •๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด IBM ๋ฌธ์„œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ฐธ์กฐํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

[Apache/IHS] IP ์ ‘์† ๋ฐ ๋ฏธ๋“ฑ๋ก ๋„๋ฉ”์ธ ์š”์ฒญ ์ฐจ๋‹จ ์„ค์ • (Default VirtualHost)

Apache(IHS) ์›น ์„œ๋ฒ„์—์„œ ๋„๋ฉ”์ธ๋ช…์ด ์•„๋‹Œ IP ์ฃผ์†Œ๋กœ ์ ‘์†ํ•˜๊ฑฐ๋‚˜, ServerName์— ์ •์˜๋˜์ง€ ์•Š์€ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ ์ด๋ฅผ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ์—๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ๋กœ๋”ฉ๋˜๋Š” Dummy VirtualHost๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹ (Context)

Apache๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์˜ Host ํ—ค๋”์™€ ์ผ์น˜ํ•˜๋Š” ServerName(๋˜๋Š” ServerAlias)์„ ์ฐพ์ง€ ๋ชปํ•  ๊ฒฝ์šฐ, ์„ค์ • ํŒŒ์ผ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์ •์˜๋œ VirtualHost๋ฅผ ๊ธฐ๋ณธ๊ฐ’(Default)์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด ์›๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ, ์ตœ์ƒ๋‹จ์— ์•„๋ฌด๋Ÿฐ ServerName์„ ๊ฐ–์ง€ ์•Š๋Š”(ํ˜น์€ ๋”๋ฏธ ๊ฐ’์„ ๊ฐ€์ง„) VirtualHost๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  403 Forbidden ๋“ฑ์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜๋ฉด, ์ง€์ •๋œ ๋„๋ฉ”์ธ ์™ธ์˜ ๋ชจ๋“  ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Web Server: IBM HTTPServer v8.5 (Apache 2.2 Base)

1. httpd.conf ์„ค์ • (VirtualHost ๊ตฌ์„ฑ)

ํ•ต์‹ฌ์€ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. ์ฐจ๋‹จ์šฉ(Dummy) ์„ค์ •์„ ์ •์ƒ ์„œ๋น„์Šค ์„ค์ •๋ณด๋‹ค ๋ฐ˜๋“œ์‹œ ์œ„์ชฝ์— ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1) ๊ธฐ๋ณธ ์„ค์ • ๋ฐ ํฌํŠธ ๋ฆฌ์Šจ

Listen 80
Listen 4958

# Apache 2.2 / IHS 8.5 ์ดํ•˜ ํ•„์ˆ˜ (IP ๊ธฐ๋ฐ˜ ๊ฐ€์ƒํ˜ธ์ŠคํŠธ ํ™œ์„ฑํ™”)
NameVirtualHost *:80
NameVirtualHost *:4958

2) ์ฐจ๋‹จ์šฉ Dummy VirtualHost (์ตœ์ƒ๋‹จ ๋ฐฐ์น˜)

์ด ๋ธ”๋ก์—๋Š” ServerName์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์˜๋ฏธ ์—†๋Š” ๊ฐ’์„ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ด๊ณณ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์€ ๋ชจ๋‘ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

# [80 ํฌํŠธ] ๋ฏธ๋“ฑ๋ก ๋„๋ฉ”์ธ/IP ์ ‘์† ์ฐจ๋‹จ
<VirtualHost *:80>
    DocumentRoot /app/was/htdocs
    
    # ์ ‘๊ทผ ๊ฑฐ๋ถ€ ๋ฉ”์‹œ์ง€ ์„ค์ • (๋ณด์•ˆ์ƒ ์ƒ์„ธ ์ •๋ณด ์ˆจ๊น€ ๊ถŒ์žฅ)
    ErrorDocument 403 "Forbidden: Access is denied."
    ErrorDocument 404 "Not Found."
    ErrorDocument 500 "Internal Server Error."
    
    # ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด 403 Forbidden ๊ฐ•์ œ ๋ฐ˜ํ™˜ (mod_rewrite ์‚ฌ์šฉ ์‹œ)
    # RewriteEngine On
    # RewriteRule .* - [R=403,L]
    
    # ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด
    <Directory "/app/was/htdocs">
        Order allow,deny
        Deny from all
    </Directory>
</VirtualHost>

# [4958 ํฌํŠธ] ๋ฏธ๋“ฑ๋ก ๋„๋ฉ”์ธ/IP ์ ‘์† ์ฐจ๋‹จ
<VirtualHost *:4958>
    DocumentRoot /app/was/htdocs
    ErrorDocument 403 "Forbidden: Access is denied."
    # ... (์ƒ๋™)
</VirtualHost>

3) ์‹ค์ œ ์„œ๋น„์Šค VirtualHost

์ •์ƒ์ ์ธ ๋„๋ฉ”์ธ(ServerName)์„ ๊ฐ€์ง„ ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค. Proxy ์„ค์ •์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

# Reverse Proxy ์‚ฌ์šฉ ์‹œ Open Relay ๋ฐฉ์ง€
ProxyRequests Off

# [80 ํฌํŠธ] ์ •์ƒ ์„œ๋น„์Šค
<VirtualHost *:80>
    ServerName test.apache.com
    
    # WAS ๋˜๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ํ”„๋ก์‹œ
    ProxyPass / http://172.31.98.155/ Keepalive=on
    ProxyPassReverse / http://172.31.98.155/
    
    # Host ํ—ค๋” ์œ ์ง€ (WAS๊ฐ€ ๋„๋ฉ”์ธ์„ ์ธ์‹ํ•˜๋„๋ก ํ•จ)
    ProxyPreserveHost On
    
    ErrorLog /app/was/HTTPServer/logs/test_proxy_error.log
    CustomLog /app/was/HTTPServer/logs/test_proxy_access.log combined
</VirtualHost>

# [4958 ํฌํŠธ] ์ •์ƒ ์„œ๋น„์Šค
<VirtualHost *:4958>
    ServerName test.httpserver.com
    
    ProxyPass / http://172.31.98.209/ Keepalive=on
    ProxyPassReverse / http://172.31.98.209/
    ProxyPreserveHost On
    
    ErrorLog /app/was/HTTPServer/logs/http_proxy_error.log
    CustomLog /app/was/HTTPServer/logs/http_proxy_access.log combined
</VirtualHost>
Tip: ProxyPreserveHost On ์˜ต์…˜์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋„๋ฉ”์ธ ์ •๋ณด(Host Header)๋ฅผ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„(WAS)๊นŒ์ง€ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. WAS์—์„œ ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ•„์ˆ˜ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

2. ๊ฒ€์ฆ (Verification)

์„ค์ • ์ ์šฉ ํ›„ ์›น ์„œ๋ฒ„๋ฅผ ์žฌ๊ธฐ๋™ํ•˜๊ณ  curl์„ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

1) ์ •์ƒ ๋„๋ฉ”์ธ ์ ‘์† ํ…Œ์ŠคํŠธ

# ์ •์ƒ ์‘๋‹ต(200 OK)์ด ์™€์•ผ ํ•จ
curl -v -H "Host: test.apache.com" http://localhost:80/

2) IP ์ ‘์† ๋ฐ ๋ฏธ๋“ฑ๋ก ๋„๋ฉ”์ธ ํ…Œ์ŠคํŠธ

# 1. IP๋กœ ์ง์ ‘ ์š”์ฒญ -> 403 ๋˜๋Š” ์„ค์ •ํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•จ
curl -v http://localhost:80/

# 2. ์—‰๋šฑํ•œ ๋„๋ฉ”์ธ ์š”์ฒญ -> 403 ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•จ
curl -v -H "Host: unknown.com" http://localhost:80/

Next Step:
Apache 2.4 (IHS 9.0 ์ด์ƒ)๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด, NameVirtualHost ์ง€์‹œ์–ด๋Š” ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ญ์ œํ•˜๊ณ , ์ ‘๊ทผ ์ œ์–ด ๊ตฌ๋ฌธ์„ Require all denied ๋“ฑ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Linux] CentOS 7 ํ˜ธ์ŠคํŠธ๋„ค์ž„(Hostname) ์˜๊ตฌ ๋ณ€๊ฒฝ ๋ฐ ํ•„์ˆ˜ ํ›„์† ์กฐ์น˜ (hostnamectl)

CentOS 7 ๋ฐ systemd ๊ธฐ๋ฐ˜ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์—์„œ hostnamectl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ŠคํŠธ๋„ค์ž„์„ ์˜๊ตฌ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ํ›„ ์‰˜ ํ”„๋กฌํ”„ํŠธ์— ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ /etc/hosts ํŒŒ์ผ ์ˆ˜์ •์˜ ์ค‘์š”์„ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹ (Context)

ํ˜ธ์ŠคํŠธ๋„ค์ž„์€ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์„œ๋ฒ„๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” /etc/sysconfig/network ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  ์žฌ๋ถ€ํŒ…ํ•ด์•ผ ํ–ˆ์œผ๋‚˜, CentOS 7๋ถ€ํ„ฐ๋Š” hostnamectl ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์žฌ๋ถ€ํŒ… ์—†์ด ์ฆ‰์‹œ ์„ค์ •์„ ์˜๊ตฌ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • System: systemd based

1. ํ˜ธ์ŠคํŠธ๋„ค์ž„ ๋ณ€๊ฒฝ (hostnamectl)

hostnamectl ๋ช…๋ น์€ ์ปค๋„ ํ˜ธ์ŠคํŠธ๋„ค์ž„ ์„ค์ •๊ณผ /etc/hostname ํŒŒ์ผ ์ˆ˜์ •์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํƒœ ํ™•์ธ

hostnamectl status

๋ณ€๊ฒฝ ๋ช…๋ น์–ด

# ๊ตฌ๋ฌธ: hostnamectl set-hostname [์ƒˆ๋กœ์šด_์ด๋ฆ„]
hostnamectl set-hostname web-server-01

2. ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ ๋ฐ ์ ์šฉ (Verification)

๋ช…๋ น์–ด ์‹คํ–‰ ์ฆ‰์‹œ ์‹œ์Šคํ…œ ์„ค์ •์€ ๋ณ€๊ฒฝ๋˜์ง€๋งŒ, ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ํ„ฐ๋ฏธ๋„์˜ ํ”„๋กฌํ”„ํŠธ(Shell Prompt)์—๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ํ™•์ธ

# 1. ์„ค์ •๊ฐ’ ํ™•์ธ
hostname

# 2. ์ƒ์„ธ ํ™•์ธ
hostnamectl status

ํ„ฐ๋ฏธ๋„ ํ”„๋กฌํ”„ํŠธ ๊ฐฑ์‹ 

๋กœ๊ทธ์•„์›ƒ ํ›„ ๋‹ค์‹œ ๋กœ๊ทธ์ธ(Reconnect)ํ•˜๋ฉด ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์žฌ์ ‘์† ์—†์ด ๋ฐ”๋กœ ํ™•์ธํ•˜๋ ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

# ํ˜„์žฌ ์‰˜ ์„ธ์…˜ ๊ฐฑ์‹ 
exec bash

๊ฒฐ๊ณผ: [root@old-name ~]# ์—์„œ [root@web-server-01 ~]# ๋กœ ๋ณ€๊ฒฝ๋จ.


3. ํ•„์ˆ˜ ํ›„์† ์กฐ์น˜: /etc/hosts ์ˆ˜์ •

ํ˜ธ์ŠคํŠธ๋„ค์ž„์„ ๋ณ€๊ฒฝํ–ˆ๋‹ค๋ฉด, ์„œ๋ฒ„ ์ž์‹ ์ด ์ž์‹ ์˜ ์ด๋ฆ„์„ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๋กœ์ปฌ DNS ์„ค์ • ํŒŒ์ผ์ธ /etc/hosts๋„ ๋ฐ˜๋“œ์‹œ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ˆ„๋ฝํ•˜๋ฉด sudo ๋ช…๋ น์–ด ์‹คํ–‰์ด ๋А๋ ค์ง€๊ฑฐ๋‚˜ ์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋™ ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ˆ˜์ •

vi /etc/hosts

์ˆ˜์ • ๋‚ด์šฉ

๊ธฐ์กด ํ˜ธ์ŠคํŠธ๋„ค์ž„์ด ์ ํžŒ ๋ถ€๋ถ„์„ ์ƒˆ๋กœ์šด ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

# ๋ณ€๊ฒฝ๋œ ํ˜ธ์ŠคํŠธ๋„ค์ž„ ์ถ”๊ฐ€ (์ž์‹ ์˜ IP ๋˜๋Š” Loopback์— ๋งคํ•‘)
127.0.0.1   web-server-01
Tip: ํด๋Ÿฌ์Šคํ„ฐ๋ง(Cluster) ํ™˜๊ฒฝ์ด๋‚˜ WAS(WebSphere, JBoss) ํ™˜๊ฒฝ์—์„œ๋Š” 127.0.0.1 ๋Œ€์‹  ์‹ค์ œ ์„œ๋ฒ„์˜ ๊ณต์ธ IP(๋˜๋Š” ์‚ฌ์„ค IP)์— ํ˜ธ์ŠคํŠธ๋„ค์ž„์„ ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

[IBM HTTPServer] SSL/TLS ์•”ํ˜ธํ™” ์ŠˆํŠธ(Cipher Suite) ํ™•์ธ ๋ฐ ์ ๊ฒ€ ๋ฐฉ๋ฒ• (DUMP_SSL_CIPHERS)

IBM HTTP Server(IHS)์—์„œ ํ˜„์žฌ ์ ์šฉ๋œ SSL/TLS ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „๊ณผ ์ง€์›ํ•˜๋Š” ์•”ํ˜ธํ™” ์ŠˆํŠธ(Cipher Suite) ๋ชฉ๋ก์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. apachectl์˜ ์ง„๋‹จ ์˜ต์…˜์„ ํ†ตํ•ด ์„œ๋ฒ„์— ์„ค์ •๋œ ๋ณด์•ˆ ์ˆ˜์ค€์„ ์ ๊ฒ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹ (Context)

๋ณด์•ˆ ์ทจ์•ฝ์  ์ ๊ฒ€ ์‹œ "SSLv3๋‚˜ RC4 ๊ฐ™์€ ์•ฝํ•œ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ผ"๋Š” ๊ถŒ๊ณ ๋ฅผ ์ž์ฃผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์—, ํ˜„์žฌ ์›น ์„œ๋ฒ„๊ฐ€ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ—ˆ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ์šฐ์„ ์ž…๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Web Server: IBM HTTPServer v8.5.0.0

1. Cipher Suite ํ™•์ธ ๋ช…๋ น์–ด

IHS๋Š” apachectl ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ์— -t(๋ฌธ๋ฒ• ๊ฒ€์‚ฌ) ์˜ต์…˜๊ณผ ํ•จ๊ป˜ -D DUMP_SSL_CIPHERS ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ, ํ˜„์žฌ ์„ค์ •๋œ SSL ๊ตฌ์„ฑ์„ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด ์‹คํ–‰

cd [IHS_HOME]/bin

# SSL Cipher ์„ค์ • ๋คํ”„
./apachectl -t -D DUMP_SSL_CIPHERS

๊ฒฐ๊ณผ ์ถœ๋ ฅ ์˜ˆ์‹œ (Default ์ƒํƒœ)

๋ณ„๋„์˜ ๋ณด์•ˆ ์„ค์ •(Hardening)์ด ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด IHS ๋ฒ„์ „์˜ ๊ธฐ๋ณธ๊ฐ’(Default)๋“ค์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

SSL default cipher lists:
SSL protocol SSLV2, FIPS off, defaults = (None)
SSL protocol SSLV3, FIPS off, defaults = TLS_RSA_WITH_AES_128_CBC_SHA(2F), ...
SSL protocol TLSv10, FIPS off, defaults = TLS_RSA_WITH_AES_128_CBC_SHA(2F), ...
SSL protocol TLSv11, FIPS off, defaults = TLS_RSA_WITH_AES_128_CBC_SHA(2F), ...
SSL protocol TLSv12, FIPS off, defaults = TLS_RSA_WITH_AES_128_GCM_SHA256(9C), ...
Syntax OK
ํ•ด์„ ์ฃผ์˜ (Analysis):
์œ„ ์ถœ๋ ฅ ๊ฒฐ๊ณผ์— SSLV3 ํ•ญ๋ชฉ์ด ๋ณด์ธ๋‹ค๋ฉด, ํ˜„์žฌ ์„œ๋ฒ„๋Š” ๋ณด์•ˆ์— ์ทจ์•ฝํ•œ SSLv3 ํ”„๋กœํ† ์ฝœ ํ†ต์‹ ์„ ํ—ˆ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด ๋น„ํ™œ์„ฑํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2. ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•œ ๊ต์ฐจ ๊ฒ€์ฆ (Verification)

์„œ๋ฒ„ ๋‚ด๋ถ€ ์„ค์ •๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์™ธ๋ถ€์—์„œ ์‹ค์ œ๋กœ ์ ‘์†์„ ์‹œ๋„ํ•˜์—ฌ ์–ด๋–ค Cipher๊ฐ€ ๋…ธ์ถœ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

1) nmap ์‚ฌ์šฉ (Linux)

nmap์˜ ์Šคํฌ๋ฆฝํŠธ ์—”์ง„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์›ํ•˜๋Š” Cipher ๋ชฉ๋ก์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

nmap --script ssl-enum-ciphers -p 443 [์„œ๋ฒ„IP]

2) OpenSSL ์‚ฌ์šฉ

ํŠน์ • ํ”„๋กœํ† ์ฝœ๋กœ ์ ‘์†์ด ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

# SSLv3 ์ ‘์† ์‹œ๋„ (์ ‘์† ์‹คํŒจํ•ด์•ผ ์•ˆ์ „ํ•จ)
openssl s_client -connect [์„œ๋ฒ„IP]:443 -ssl3

3. ๋ณด์•ˆ ์„ค์ • ๊ฐ•ํ™” (Next Step)

์ทจ์•ฝํ•œ ํ”„๋กœํ† ์ฝœ๊ณผ Cipher๋ฅผ ํ™•์ธํ–ˆ๋‹ค๋ฉด, httpd.conf ํŒŒ์ผ์—์„œ ์ด๋ฅผ ์ฐจ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ์˜ˆ์‹œ (httpd.conf)

IHS์—์„œ๋Š” SSLCipherSpec ์ง€์‹œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • Cipher๋ฅผ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

<VirtualHost *:443>
    SSLEnable
    
    # 1. ์ทจ์•ฝํ•œ ํ”„๋กœํ† ์ฝœ ๋น„ํ™œ์„ฑํ™” (TLS 1.2๋งŒ ํ—ˆ์šฉ ๊ถŒ์žฅ)
    SSLProtocolDisable SSLv2 SSLv3 TLSv10 TLSv11
    SSLProtocolEnable TLSv12

    # 2. ๊ฐ•๋ ฅํ•œ Cipher Suite๋งŒ ํ—ˆ์šฉ (์˜ˆ์‹œ)
    # 128๋น„ํŠธ ๋ฏธ๋งŒ ์ฐจ๋‹จ, RC4/MD5 ์ฐจ๋‹จ
    SSLCipherSpec TLS_RSA_WITH_AES_128_CBC_SHA
    SSLCipherSpec TLS_RSA_WITH_AES_256_CBC_SHA
    # ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€...
</VirtualHost>

4. ์ฐธ๊ณ  ์ž๋ฃŒ (References)

[JBoss EAP 6] ์ปค์Šคํ…€ ๊ธฐ๋™/์ •์ง€ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ๊ฐ€์ด๋“œ (Config ๋ถ„๋ฆฌ ๋ฐ JVM ํŠœ๋‹)

JBoss EAP 6 Standalone ๋ชจ๋“œ์˜ ์šด์˜ ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด, JVM ์˜ต์…˜๊ณผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ณ„๋„์˜ ์„ค์ • ํŒŒ์ผ(Config Shell)๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์ด๋ฅผ ๋กœ๋“œํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์ œ์–ด(Start/Stop/Status)ํ•˜๋Š” ์ปค์Šคํ…€ ์‰˜ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ๋ฒ•์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Middleware: JBoss EAP 6.4

1. ์Šคํฌ๋ฆฝํŠธ ๊ตฌ์กฐ ๋ฐ ์ „๋žต

์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‘ ๊ฐœ์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  1. Config Script (config1.sh): JVM ์˜ต์…˜, ๊ฒฝ๋กœ, IP, ํฌํŠธ ๋“ฑ ๋ณ€์ˆ˜ ์ •์˜.
  2. Control Script (jboss_ctl.sh): Config๋ฅผ ๋กœ๋“œํ•˜์—ฌ ์‹ค์ œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๋Š” ๋กœ์ง.

2. ์„ค์ • ์Šคํฌ๋ฆฝํŠธ (config1.sh)

์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ณ„ ๊ณ ์œ ํ•œ ์„ค์ •์„ ์ด๊ณณ์— ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. JAVA_OPTS๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ฐ GC ๋กœ๊ทธ ์„ค์ •์„ ์ƒ์„ธํ•˜๊ฒŒ ํŠœ๋‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#!/bin/sh
DATE=`date +%Y%m%d%H%M%S`

##### 1. Basic Configuration #####
export JBOSS_HOME=/SW/was/JBoss
export SERVER_HOME=/SW/was/JBoss/TEST/TESTServer11
export LOG_PATH=/app/logs/was
export NODE_NAME=TESTServer11
export CONFIG_FILE=standalone-ha.xml

# Network & Port Offset
export SERVER_IP=10.252.16.25
export PORT_OFFSET=750
export MGMT_ADDR=$SERVER_IP

# Controller Port Calculation (Base 9999 + Offset)
let CONTROLLER_PORT=9999+$PORT_OFFSET
export CONTROLLER_PORT

# Admin User (Shutdown์šฉ)
export USER=admin

##### 2. JVM Options (Memory & GC) #####
# Heap Memory
export JAVA_OPTS="-server -Xms1024m -Xmx2048m -XX:MaxPermSize=256m"

# GC Logging
export JAVA_OPTS=" $JAVA_OPTS -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails "
export JAVA_OPTS=" $JAVA_OPTS -Xloggc:$LOG_PATH/log/gclog/gc_$DATE.log "

# GC Algorithm (ParallelGC)
export JAVA_OPTS=" $JAVA_OPTS -XX:+UseParallelGC -XX:+ExplicitGCInvokesConcurrent"

# Heap Dump on OOM
export JAVA_OPTS=" $JAVA_OPTS -XX:-HeapDumpOnOutOfMemoryError "
export JAVA_OPTS=" $JAVA_OPTS -XX:HeapDumpPath=$LOG_PATH/heap/$NODE_NAME "

##### 3. System Properties (-D options) #####
export JAVA_OPTS=" $JAVA_OPTS -Djava.net.preferIPv4Stack=true"
export JAVA_OPTS=" $JAVA_OPTS -Dorg.jboss.resolver.warning=true"
export JAVA_OPTS=" $JAVA_OPTS -Djava.awt.headless=true"
export JAVA_OPTS=" $JAVA_OPTS -DjvmRoute=$NODE_NAME"

# JBoss Path & Binding
export JAVA_OPTS=" $JAVA_OPTS -Djboss.server.base.dir=$SERVER_HOME"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.server.log.dir=$LOG_PATH/$NODE_NAME"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.socket.binding.port-offset=$PORT_OFFSET"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.node.name=$NODE_NAME"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.bind.address.management=$MGMT_ADDR"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.bind.address=$SERVER_IP"

# Clustering (Multicast)
export JAVA_OPTS=" $JAVA_OPTS -Djboss.default.jgroups.stack=tcp"
# export JAVA_OPTS=" $JAVA_OPTS -Djboss.default.multicast.address=230.1.0.1"

echo "Configuration Loaded: $NODE_NAME"

3. ์ œ์–ด ์Šคํฌ๋ฆฝํŠธ (jboss_ctl.sh)

์‹ค์ œ ๊ธฐ๋™ ๋ฐ ์ •์ง€๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ฉ”์ธ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. ./config/config1.sh๋ฅผ ๋กœ๋“œํ•˜์—ฌ ๋ณ€์ˆ˜๋“ค์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

#!/bin/sh

# Config ํŒŒ์ผ ๋กœ๋“œ (๊ฒฝ๋กœ ์ฃผ์˜)
. ./config/config1.sh

start(){
    # ํ”„๋กœ์„ธ์Šค ์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€
    PID=`ps -ef | grep java | grep "jboss.node.name=$NODE_NAME " | awk '{print $2}'`
    
    if [ "x$PID" != "x" ]; then
        echo "###############################################"
        echo "ERROR: JBoss SERVER ($NODE_NAME) is already RUNNING (PID=$PID)"
        echo "###############################################"
        exit 1
    fi

    echo "#######################"
    echo "   Starting JBoss EAP  "
    echo "#######################"
    
    # nohup์œผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰, ๋กœ๊ทธ ๋ฆฌ๋‹ค์ด๋ ‰์…˜
    nohup $JBOSS_HOME/bin/standalone.sh --server-config=$CONFIG_FILE >> $LOG_PATH/console.log 2>&1 &

    echo "Starting... Wait for checking status..."
    sleep 5
    status
}

stop(){
    echo "#######################"
    echo "    Stopping JBoss     "
    echo "#######################"
    
    # ๋ณด์•ˆ์„ ์œ„ํ•ด ํŒจ์Šค์›Œ๋“œ๋Š” ์ž…๋ ฅ๋ฐ›๋„๋ก ์ฒ˜๋ฆฌ (์ž๋™ํ™” ์‹œ ๋ณ€์ˆ˜๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ)
    echo -n "Enter Controller Password: "
    read -s PASSWORD
    echo ""

    # CLI๋ฅผ ์ด์šฉํ•œ ์•ˆ์ „ํ•œ ์ข…๋ฃŒ (Graceful Shutdown)
    $JBOSS_HOME/bin/jboss-cli.sh --connect --controller=$SERVER_IP:$CONTROLLER_PORT --command=:shutdown --user=$USER --password=$PASSWORD
}

status() {
    # ํฌํŠธ ๋ฆฌ์Šจ ์ƒํƒœ๋กœ ๊ตฌ๋™ ์—ฌ๋ถ€ ํ™•์ธ
    _up=`netstat -an | grep $CONTROLLER_PORT | grep LISTEN | wc -l`
    
    if [ "$_up" -ne 0 ]; then
        PID=`ps -ef | grep java | grep "jboss.node.name=$NODE_NAME " | awk '{print $2}'`
        echo "###############################################"
        echo " JBoss Server is RUNNING !! "
        echo " Node: $NODE_NAME (PID: $PID)"
        echo " Port: $CONTROLLER_PORT (Management)"
        echo "###############################################"
    else
        echo "##################################"
        echo " JBoss Server is STOPPED !! "
        echo " Node: $NODE_NAME "
        echo "##################################"
    fi
}

# ํŒŒ๋ผ๋ฏธํ„ฐ ์ฒ˜๋ฆฌ
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status
    ;;
  restart)
    stop
    sleep 5
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|status|restart}"
    exit 1
esac
exit 0

4. ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ๋ฐ ์ฃผ์˜์‚ฌํ•ญ

์‚ฌ์šฉ๋ฒ•

# ์‹คํ–‰ ๊ถŒํ•œ ๋ถ€์—ฌ
chmod +x jboss_ctl.sh

# ๊ธฐ๋™
./jboss_ctl.sh start

# ์ƒํƒœ ํ™•์ธ
./jboss_ctl.sh status

# ์ •์ง€ (ํŒจ์Šค์›Œ๋“œ ์ž…๋ ฅ ํ•„์š”)
./jboss_ctl.sh stop
Tip: config1.sh ํŒŒ์ผ ๋‚ด์˜ PORT_OFFSET ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด, ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ ์„œ๋ฒ„์—์„œ ํฌํŠธ ์ถฉ๋Œ ์—†์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ: 0, 100, 200...)

[Linux/Java] High CPU ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…: OS ์Šค๋ ˆ๋“œ์™€ Java ์Šค๋ ˆ๋“œ ๋งคํ•‘ ๋ถ„์„ ๊ฐ€์ด๋“œ

Java ํ”„๋กœ์„ธ์Šค(JVM)๊ฐ€ ๊ณ ๋ถ€ํ•˜ ์ƒํƒœ์ผ ๋•Œ, CPU๋ฅผ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ๋ฒ”์ธ(ํŠน์ • ์Šค๋ ˆ๋“œ)์„ ์ฐพ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. OS ๋ช…๋ น์–ด(ps, top)๋กœ ๋ฌธ์ œ์˜ ์Šค๋ ˆ๋“œ ID(TID)๋ฅผ ์‹๋ณ„ํ•˜๊ณ , ์ด๋ฅผ 16์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ Java Thread Dump์™€ ๋งคํ•‘ํ•˜๋Š” ๊ณผ์ •์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

Test Environment

  • OS: RedHat Linux (CentOS ํ˜ธํ™˜)
  • Target: Java Process (WebSphere/Tomcat ๋“ฑ)

1. ํ”„๋กœ์„ธ์Šค ๋ฐ ์Šค๋ ˆ๋“œ ์‹๋ณ„ (Identify Usage)

๋จผ์ € CPU๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” Java ํ”„๋กœ์„ธ์Šค์˜ PID(Process ID)๋ฅผ ์ฐพ๊ณ , ๊ทธ ๋‚ด๋ถ€์—์„œ ์‹ค์ œ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•˜๋Š” ์Šค๋ ˆ๋“œ(LWP, Light Weight Process)๋ฅผ ์‹๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด ํ”„๋กœ์„ธ์Šค ํ™•์ธ

# Java ํ”„๋กœ์„ธ์Šค PID ํ™•์ธ
ps -ef | grep java

์Šค๋ ˆ๋“œ๋ณ„ CPU ์ ์œ ์œจ ํ™•์ธ (top)

-H ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์˜ ์Šค๋ ˆ๋“œ ๋‹จ์œ„๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

# PID๊ฐ€ 12345์ธ ๊ฒฝ์šฐ
top -H -p 12345

์ถœ๋ ฅ ํ™”๋ฉด์—์„œ PID(์‹ค์ œ๋กœ๋Š” TID/LWP) ์ปฌ๋Ÿผ๊ณผ %CPU ์ปฌ๋Ÿผ์„ ํ™•์ธํ•˜์—ฌ ๊ฐ€์žฅ ์ƒ๋‹จ์— ์žˆ๋Š” ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ๋ณ„ CPU ์ ์œ ์œจ ํ™•์ธ (ps)

ps ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ๋„ ์Šค๋ ˆ๋“œ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -lmT ์˜ต์…˜์ด๋‚˜ -L ์˜ต์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

# LWP(Light Weight Process) ํ™•์ธ
ps -lmT [PID]

# ๋˜๋Š” ์ปค์Šคํ…€ ํฌ๋งท ์‚ฌ์šฉ
ps -eLo pid,lwp,pcpu,comm | grep [PID]

2. ์Šค๋ ˆ๋“œ ID ๋ณ€ํ™˜ (Decimal to Hex)

OS์—์„œ ํ™•์ธํ•œ ์Šค๋ ˆ๋“œ ID๋Š” 10์ง„์ˆ˜(Decimal)์ด์ง€๋งŒ, Java Thread Dump ํŒŒ์ผ(Javacore ๋“ฑ)์—์„œ๋Š” ์Šค๋ ˆ๋“œ ID๊ฐ€ 16์ง„์ˆ˜(Hexadecimal)๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งคํ•‘์„ ์œ„ํ•ด ๋ณ€ํ™˜ ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€ํ™˜ ์˜ˆ์‹œ

  • OS TID: 9091 (10์ง„์ˆ˜)
  • Hex TID: 0x2383 (16์ง„์ˆ˜)

๋ณ€ํ™˜ ๋ช…๋ น์–ด

# ์‰˜์—์„œ ๋ฐ”๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ (์˜ˆ: 9091 -> 2383)
printf '%x\n' 9091

3. ์Šค๋ ˆ๋“œ ๋คํ”„ ์ƒ์„ฑ ๋ฐ ๋ถ„์„ (Thread Dump)

ํ˜„์žฌ JVM์˜ ์ƒํƒœ๋ฅผ ์Šค๋ƒ…์ƒท์œผ๋กœ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•ด ์Šค๋ ˆ๋“œ ๋คํ”„๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋คํ”„ ์ƒ์„ฑ (Kill -3)

kill -3 ์‹œ๊ทธ๋„์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜์ง€ ์•Š๊ณ  ํ‘œ์ค€ ์ถœ๋ ฅ(stdout)์ด๋‚˜ ๋กœ๊ทธ ํŒŒ์ผ๋กœ ์Šค๋ ˆ๋“œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

kill -3 [PID]
  • IBM JDK (WebSphere): javacore.YYYYMMDD.HHMMSS.pid.txt ํŒŒ์ผ ์ƒ์„ฑ
  • Oracle/Open JDK: catalina.out ๋˜๋Š” ์ง€์ •๋œ ๋กœ๊ทธ ํŒŒ์ผ์— ์ถœ๋ ฅ

๋กœ๊ทธ ๋งคํ•‘ ๋ถ„์„

์ƒ์„ฑ๋œ ๋คํ”„ ํŒŒ์ผ์—์„œ ์•ž์„œ ๋ณ€ํ™˜ํ•œ 16์ง„์ˆ˜ ๊ฐ’(์˜ˆ: 0x2383)์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. IBM JDK์˜ ๊ฒฝ์šฐ nid(Native ID) ๋˜๋Š” native_thread_id ํ•ญ๋ชฉ๊ณผ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค.

/* Javacore ์˜ˆ์‹œ */
"WebContainer : 5" (TID:0x12345600, sys_thread_t:0x789abc00, state:R, native ID:0x2383) prio=5
    at com.example.MyClass.infiniteLoop(MyClass.java:45)
    at ...

๋ถ„์„ ํฌ์ธํŠธ:

  1. 16์ง„์ˆ˜ ID๋กœ ๊ฒ€์ƒ‰ํ•˜์—ฌ ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  2. ํ•ด๋‹น ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ(Runnable, Waiting ๋“ฑ)๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. Stack Trace๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์–ด๋–ค ์ฝ”๋“œ(๋ฉ”์†Œ๋“œ)๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํŒŒ์•…ํ•˜์—ฌ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

Next Step:
์ฃผ๊ธฐ์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํ•„์š”ํ•˜๋‹ค๋ฉด top -H์™€ jstack์„ ๊ฒฐํ•ฉํ•œ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ, CPU ์ž„๊ณ„์น˜ ์ดˆ๊ณผ ์‹œ ์ž๋™์œผ๋กœ ๋คํ”„๋ฅผ ๋‚จ๊ธฐ๋„๋ก ์ž๋™ํ™”ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[JBoss EAP 6] CLI ๊ธฐ๋ฐ˜ ํŒจ์น˜ ์ ์šฉ(Apply) ๋ฐ ๋กค๋ฐฑ(Rollback) ์™„๋ฒฝ ๊ฐ€์ด๋“œ

JBoss EAP 6 ํ™˜๊ฒฝ์—์„œ Management CLI(jboss-cli)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ ํŒจ์น˜๋‚˜ ๋ฒ„๊ทธ ํ”ฝ์Šค๋ฅผ ์ ์šฉ(Apply)ํ•˜๊ณ , ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๋กค๋ฐฑ(Rollback) ์ ˆ์ฐจ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํŒจ์น˜ ์ด๋ ฅ ๊ด€๋ฆฌ์™€ ์„ค์ • ์ดˆ๊ธฐํ™” ์˜ต์…˜์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹ (Context)

JBoss EAP 6์˜ ํŒจ์น˜ ์‹œ์Šคํ…œ์€ ๋ˆ„์ (Cumulative) ๋ฐฉ์‹๊ณผ ๋‹จ์ผ(One-off) ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ํŒจ์น˜๋ฅผ ์ ์šฉํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ .installation ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณ€๊ฒฝ ๋‚ด์—ญ์ด ์ €์žฅ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์–ธ์ œ๋“  ์ด์ „ ์‹œ์ ์œผ๋กœ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Test Environment

  • OS: Windows 10 (Linux ๋ช…๋ น์–ด ํฌํ•จ)
  • Middleware: JBoss EAP 6.4
  • Patch File: jboss-eap-6.4.19-patch.zip

1. ํŒจ์น˜ ์ ์šฉ (Patch Apply)

ํŒจ์น˜ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„, JBoss๊ฐ€ ๊ฐ€๋™๋œ ์ƒํƒœ(๋˜๋Š” Embed ๋ชจ๋“œ)์—์„œ CLI๋ฅผ ํ†ตํ•ด ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

# ๊ธฐ๋ณธ ๊ตฌ๋ฌธ
patch apply [ํŒจ์น˜ํŒŒ์ผ_๊ฒฝ๋กœ]

OS๋ณ„ ์‹คํ–‰ ์˜ˆ์‹œ

Linux

$JBOSS_HOME/bin/jboss-cli.sh --connect
[standalone@localhost:9999 /] patch apply /was/img/fix/jboss-eap-6.4.19-patch.zip

Windows

%JBOSS_HOME%\bin\jboss-cli.bat --connect
[standalone@localhost:9999 /] patch apply F:\app\was\jboss-eap-6.4.19-patch.zip
Note: ํŒจ์น˜ ์ ์šฉ ํ›„์—๋Š” ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ์„œ๋ฒ„๋ฅผ ์žฌ๊ธฐ๋™(Restart)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ํŒจ์น˜ ์ด๋ ฅ ํ™•์ธ (Verification)

ํŒจ์น˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ ์šฉ๋˜์—ˆ๋Š”์ง€, ํ˜น์€ ๋กค๋ฐฑ์„ ์œ„ํ•ด ๋Œ์•„๊ฐˆ ์‹œ์ (ID)์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

CLI์—์„œ ํ™•์ธ

# ํŒจ์น˜ ์ •๋ณด ์กฐํšŒ
[standalone@localhost:9999 /] patch history

# ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ
[standalone@localhost:9999 /] patch info

ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ํ™•์ธ

JBoss ์„ค์น˜ ๊ฒฝ๋กœ ๋‚ด์˜ ์ˆจ๊น€ ํด๋”๋ฅผ ํ†ตํ•ด์„œ๋„ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฒฝ๋กœ: {JBoss_HOME}/.installation/patches

3. ํŒจ์น˜ ๋กค๋ฐฑ (Patch Rollback)

ํŒจ์น˜ ์ ์šฉ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค๋ฉด ์ฆ‰์‹œ ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์ค€๋น„: Patch ID ํ™•์ธ

๋กค๋ฐฑํ•  ๋Œ€์ƒ ID๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. patch history ๋ช…๋ น์–ด๋กœ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ ์šฉ๋œ ํŒจ์น˜ ID๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋กค๋ฐฑ ๋ช…๋ น์–ด

# ๊ตฌ๋ฌธ
patch rollback --patch-id=[PATCH_ID] --reset-configuration=[TRUE|FALSE]

ํ•ต์‹ฌ ์˜ต์…˜ ์„ค๋ช… (--reset-configuration)

  • TRUE (๊ถŒ์žฅ): ํŒจ์น˜ ์ ์šฉ ์‹œ ๋ณ€๊ฒฝ๋˜์—ˆ๋˜ ์„ค์ • ํŒŒ์ผ(standalone.xml ๋“ฑ)๋„ ํŒจ์น˜ ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.
  • FALSE: ์„ค์ • ํŒŒ์ผ์€ ํ˜„ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋ชจ๋“ˆ(Jar)๋งŒ ๋กค๋ฐฑํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ์ถฉ๋Œ๋กœ ์ธํ•ด ์„œ๋ฒ„ ๊ธฐ๋™์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์˜ˆ์‹œ

# ์„ค์ •๊นŒ์ง€ ์™„๋ฒฝํ•˜๊ฒŒ ์ด์ „์œผ๋กœ ๋ณต๊ตฌ
[standalone@localhost:9999 /] patch rollback --patch-id=CP19 --reset-configuration=true

4. ๊ด€๋ฆฌ ์ฝ˜์†”(GUI)์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•

CLI ์‚ฌ์šฉ์ด ์–ด๋ ต๋‹ค๋ฉด ์›น ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ๋„ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ ‘์†: http://localhost:9990/console
  2. ๋ฉ”๋‰ด: ์ƒ๋‹จ Patching ํƒญ ์„ ํƒ
  3. ์ž‘์—…: ํŒจ์น˜ ๋งˆ๋ฒ•์‚ฌ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ์ ์šฉ (๋กค๋ฐฑ ๊ธฐ๋Šฅ ํฌํ•จ)
JBoss Management Console Patching Screen

[๊ทธ๋ฆผ] JBoss ๊ด€๋ฆฌ ์ฝ˜์†”์˜ ํŒจ์น˜ ๊ด€๋ฆฌ ํ™”๋ฉด


Next Step:
ํŒจ์น˜ ์ž‘์—… ์ „์—๋Š” ๋งŒ์•ฝ์„ ๋Œ€๋น„ํ•ด standalone ๋˜๋Š” domain ๋””๋ ‰ํ† ๋ฆฌ ์ „์ฒด๋ฅผ ์••์ถ•ํ•˜์—ฌ ๋ณ„๋„๋กœ ๋ฐฑ์—…ํ•ด๋‘๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

[WebSphere] ๋””๋ ‰ํ† ๋ฆฌ ๋ฆฌ์ŠคํŒ…(Directory Listing) ์ œ๊ฑฐ ๋ฐ ๋ณด์•ˆ ์„ค์ • (directoryBrowsingEnabled)

์›น ์„œ๋ฒ„๊ฐ€ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ํŒŒ์ผ ๋ชฉ๋ก์„ ๋ธŒ๋ผ์šฐ์ €์— ๋…ธ์ถœํ•˜๋Š” '๋””๋ ‰ํ† ๋ฆฌ ๋ฆฌ์ŠคํŒ…' ์ทจ์•ฝ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ WebSphere ์„ค์ • ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ(xml) ์ˆ˜์ • ๋ฐฉ์‹๊ณผ ๊ด€๋ฆฌ ์ฝ˜์†”(Admin Console)์„ ํ†ตํ•œ ์ „์—ญ ์„ค์ • ๋ฐฉ์‹์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์›์ธ (Context)

๋””๋ ‰ํ† ๋ฆฌ ๋ฆฌ์ŠคํŒ…์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉด ๊ณต๊ฒฉ์ž๊ฐ€ ์„œ๋ฒ„์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์™€ ํŒŒ์ผ ๋ชฉ๋ก(๋ฐฑ์—… ํŒŒ์ผ, ์†Œ์Šค ์ฝ”๋“œ ๋“ฑ)์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด 2์ฐจ ๊ณต๊ฒฉ์˜ ๋นŒ๋ฏธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

WebSphere๋Š” ์ •์  ํŒŒ์ผ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ fileServingEnabled ์†์„ฑ๊ณผ ๋ชฉ๋ก ๋…ธ์ถœ์„ ์œ„ํ•œ directoryBrowsingEnabled ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์ ์ ˆํžˆ ์ œ์–ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Web Server: IBM HTTPServer v8.5.0.0
  • WAS: WebSphere Application Server v8.5

1. Method A: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ • ํŒŒ์ผ ์ˆ˜์ •

๊ฐœ๋ณ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ์œ„๋กœ ์„ค์ •์„ ์ ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. WAR/EAR ํŒŒ์ผ ๋‚ด๋ถ€์˜ IBM ํ™•์žฅ ์„ค์ • ํŒŒ์ผ์„ ์ง์ ‘ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ๋Œ€์ƒ

  • WAS v7.0 ์ด์ƒ: ibm-web-ext.xml
  • WAS v6.1 ์ดํ•˜: ibm-web-ext.xmi (Legacy)

์„ค์ • ๋‚ด์šฉ (ibm-web-ext.xml)

enable-directory-browsing ์†์„ฑ์„ false๋กœ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<web-ext
    xmlns="http://websphere.ibm.com/xml/ns/javaee/web-ext/1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee/web-ext/1.0 http://websphere.ibm.com/xml/ns/javaee/web-ext/1.0/web-ext.xsd">

    <!-- ์ •์  ํŒŒ์ผ ์„œ๋น™ ํ™œ์„ฑํ™” (์ด๋ฏธ์ง€, HTML ๋“ฑ) -->
    <enable-file-serving value="true"/>
    
    <!-- ํ•ต์‹ฌ: ๋””๋ ‰ํ† ๋ฆฌ ๋ฆฌ์ŠคํŒ… ๋น„ํ™œ์„ฑํ™” -->
    <enable-directory-browsing value="false"/>

</web-ext>

2. Method B: ์›น ์ปจํ…Œ์ด๋„ˆ(Web Container) ์ „์—ญ ์„ค์ •

WAS ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ ์„œ๋ฒ„ ๋‹จ์œ„๋กœ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ œ์–ดํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌ๋ฐฐํฌํ•˜์ง€ ์•Š๊ณ  ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค.

์„ค์ • ๊ฒฝ๋กœ

์„œ๋ฒ„(Servers) > ์„œ๋ฒ„ ์œ ํ˜•(Server Types) > WebSphere application servers > [์„œ๋ฒ„๋ช…] > ์›น ์ปจํ…Œ์ด๋„ˆ ์„ค์ •(Web Container Settings) > ์›น ์ปจํ…Œ์ด๋„ˆ(Web container) > ์‚ฌ์šฉ์ž ์ •์˜ ํŠน์„ฑ(Custom properties)

์ฃผ์š” ์†์„ฑ ๊ฐ’

์•„๋ž˜ ์†์„ฑ์„ ์ƒˆ๋กœ ์ž‘์„ฑ(New)ํ•˜์—ฌ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฆ„ (Name) ๊ฐ’ (Value) ์„ค๋ช…
directoryBrowsingEnabled false ๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก ์กฐํšŒ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. (๋ณด์•ˆ ํ•„์ˆ˜)
fileServingEnabled true WAS๊ฐ€ ์ •์  ํŒŒ์ผ(html, img ๋“ฑ)์„ ์ฒ˜๋ฆฌํ• ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. (false ์„ค์ • ์‹œ ์ •์  ํŒŒ์ผ ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ)
์ฐธ๊ณ : fileServingEnabled๋ฅผ false๋กœ ์„ค์ •ํ•˜๋ฉด ๋””๋ ‰ํ† ๋ฆฌ ๋ฆฌ์ŠคํŒ…๋„ ์ฐจ๋‹จ๋˜์ง€๋งŒ, WAS๊ฐ€ ์ด๋ฏธ์ง€๋‚˜ CSS ๊ฐ™์€ ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ์ „ํ˜€ ์ œ๊ณตํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” directoryBrowsingEnabled๋งŒ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

3. ๊ฒ€์ฆ (Verification)

  1. ์„ค์ • ์ ์šฉ ํ›„ WAS ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ธŒ๋ผ์šฐ์ €์—์„œ index.html์ด ์—†๋Š” ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ(์˜ˆ: http://domain/images/)๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.
  3. 403 Forbidden ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ณด์•ˆ ์„ค์ •์ด ์ •์ƒ์ ์œผ๋กœ ์ ์šฉ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[OpenSSL/Apache] ์‚ฌ์„ค ์ธ์ฆ์„œ(Self-Signed Certificate) ์ƒ์„ฑ ๋ฐ ์ ์šฉ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์˜ HTTPS ๊ตฌํ˜„์„ ์œ„ํ•ด OpenSSL๋กœ ์‚ฌ์„ค ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์‹ค๋ฌด์—์„œ ํ˜ผ๋™ํ•˜๊ธฐ ์‰ฌ์šด Key, CSR, CRT ํŒŒ์ผ์˜ ์ •ํ™•ํ•œ ์—ญํ•  ์ •์˜๋ถ€ํ„ฐ, ๊ฐœ์ธํ‚ค ํŒจ์Šค์›Œ๋“œ ์ œ๊ฑฐ ๋ฐ Apache ์ ์šฉ๊นŒ์ง€์˜ ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹: ์ธ์ฆ์„œ ํŒŒ์ผ์˜ ์ข…๋ฅ˜์™€ ์—ญํ• 

SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ณผ์ •์€ ๊ฐœ์ธํ‚ค ์ƒ์„ฑ → ์ธ์ฆ ์š”์ฒญ(CSR) → ์ธ์ฆ์„œ ๋ฐœ๊ธ‰(CRT)์˜ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๋˜๋Š” ํŒŒ์ผ์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • 1. Private Key (.key):
    • ์„œ๋ฒ„๊ฐ€ ๊ฐ–๋Š” ๋น„๋ฐ€ ์—ด์‡ ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”ํ•˜๋Š” ํ•ต์‹ฌ ํŒŒ์ผ๋กœ, ์ ˆ๋Œ€ ์™ธ๋ถ€๋กœ ์œ ์ถœ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
    • ์ด ํ‚ค๋ฅผ ๋ถ„์‹คํ•˜๋ฉด ์ธ์ฆ์„œ๋ฅผ ์žฌ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 2. CSR (.csr - Certificate Signing Request):
    • ์ธ์ฆ ๊ธฐ๊ด€(CA)์— "๋‚ด ์ธ์ฆ์„œ๋ฅผ ๋งŒ๋“ค์–ด ๋‹ฌ๋ผ"๊ณ  ๋ณด๋‚ด๋Š” ์‹ ์ฒญ์„œ์ž…๋‹ˆ๋‹ค.
    • ๊ณต๊ฐœํ‚ค(Public Key) ์ •๋ณด์™€ ๋„๋ฉ”์ธ, ํšŒ์‚ฌ ์ •๋ณด(DN)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • 3. Certificate (.crt):
    • ์ตœ์ข…์ ์œผ๋กœ ๋ฐœ๊ธ‰๋œ ์ธ์ฆ์„œ(์‹ ๋ถ„์ฆ)์ž…๋‹ˆ๋‹ค.
    • CSR ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ CA(ํ˜น์€ ๋ณธ์ธ)๊ฐ€ ์ „์ž ์„œ๋ช…์„ ํ•œ ํŒŒ์ผ์ด๋ฉฐ, ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์—๊ฒŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Web Server: Apache HTTP Server
  • Tool: OpenSSL

1. ๊ฐœ์ธํ‚ค(Private Key) ์ƒ์„ฑ

๊ฐ€์žฅ ๋จผ์ € ๋ชจ๋“  ์•”ํ˜ธํ™” ํ†ต์‹ ์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๊ฐœ์ธํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

1) ์•”ํ˜ธํ™”๋œ ๊ฐœ์ธํ‚ค ์ƒ์„ฑ

des3 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ 2048๋น„ํŠธ ๊ธธ์ด์˜ RSA ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์„ค์ •ํ•˜๋Š” ํŒจ์Šค์›Œ๋“œ(Pass Phrase)๋Š” ํ‚ค๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ์žฅ์น˜์ž…๋‹ˆ๋‹ค.

[root@web01 test]# openssl genrsa -des3 -out test.vn.key 2048

Generating RSA private key, 2048 bit long modulus
..........................+++
e is 65537 (0x10001)
Enter pass phrase for test.vn.key: [ํŒจ์Šค์›Œ๋“œ ์ž…๋ ฅ]
Verifying - Enter pass phrase for test.vn.key: [ํŒจ์Šค์›Œ๋“œ ํ™•์ธ]

2) ๊ฐœ์ธํ‚ค ํŒจ์Šค์›Œ๋“œ ์ œ๊ฑฐ (ํ•„์ˆ˜ ๊ถŒ์žฅ)

ํŒจ์Šค์›Œ๋“œ๊ฐ€ ๊ฑธ๋ฆฐ ํ‚ค๋ฅผ ์›น ์„œ๋ฒ„์— ๊ทธ๋Œ€๋กœ ์ ์šฉํ•˜๋ฉด, ์„œ๋ฒ„๊ฐ€ ์žฌ๊ธฐ๋™๋  ๋•Œ๋งˆ๋‹ค ๊ด€๋ฆฌ์ž๊ฐ€ ๋งค๋ฒˆ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์šด์˜์„ ์œ„ํ•ด ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ ํ‚ค๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

# 1. ์›๋ณธ ํ‚ค ๋ฐฑ์—…
cp test.vn.key test.vn.key.orig

# 2. ํŒจ์Šค์›Œ๋“œ๊ฐ€ ์ œ๊ฑฐ๋œ ํ‚ค ์ƒ์„ฑ (๋ฎ์–ด์“ฐ๊ธฐ)
openssl rsa -in test.vn.key.orig -out test.vn.key

# ๊ฒฐ๊ณผ ๋ฉ”์‹œ์ง€
Enter pass phrase for test.vn.key.orig: [๊ธฐ์กด ํŒจ์Šค์›Œ๋“œ ์ž…๋ ฅ]
writing RSA key

2. ์ธ์ฆ ์š”์ฒญ์„œ(CSR) ์ƒ์„ฑ

์ƒ์„ฑ๋œ ๊ฐœ์ธํ‚ค(.key)๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์‹ ์ฒญ์„œ(.csr)๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

CSR ์ƒ์„ฑ ๋ช…๋ น์–ด

openssl req -new -key test.vn.key -out test.vn.csr

์ฃผ์š” ์ž…๋ ฅ ์ •๋ณด (DN: Distinguished Name)

๋ช…๋ น ์‹คํ–‰ ํ›„ ์ž…๋ ฅํ•ด์•ผ ํ•  ์ •๋ณด์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ •๋ณด๋Š” ์ž„์˜๋กœ ์ž…๋ ฅํ•ด๋„ ๋˜์ง€๋งŒ, Common Name์€ ๋ฐ˜๋“œ์‹œ ์ •ํ™•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Country Name: ๊ตญ๊ฐ€ ์ฝ”๋“œ (์˜ˆ: KR, VN)
  • State / Locality: ์ง€์—ญ ์ •๋ณด (์˜ˆ: Seoul)
  • Organization: ํšŒ์‚ฌ๋ช…/๋ถ€์„œ๋ช… (์˜ˆ: IT Team)
  • Common Name (CN): ์„œ๋น„์Šค ๋„๋ฉ”์ธ ์ฃผ์†Œ (๊ฐ€์žฅ ์ค‘์š”! ์˜ˆ: *.test.vn)
Note: ์ถ”๊ฐ€ ์ •๋ณด์ธ 'Challenge password' ๋“ฑ์€ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ  Enter๋ฅผ ๋ˆŒ๋Ÿฌ ๋„˜์–ด๊ฐ€๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

3. ์‚ฌ์„ค ์ธ์ฆ์„œ(CRT) ์ƒ์„ฑ (Self-Signing)

์šฐ๋ฆฌ๋Š” ๊ณต์ธ ์ธ์ฆ ๊ธฐ๊ด€(VeriSign ๋“ฑ)์ด ์—†์œผ๋ฏ€๋กœ, ์ƒ์„ฑํ•œ CSR์— ๋‚ด ๊ฐœ์ธํ‚ค๋กœ ์ง์ ‘ ์„œ๋ช…(Self-Sign)ํ•˜์—ฌ ์ธ์ฆ์„œ(CRT)๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ธ์ฆ์„œ ์ƒ์„ฑ

์œ ํšจ๊ธฐ๊ฐ„์„ 365์ผ๋กœ ์„ค์ •ํ•˜์—ฌ ์ตœ์ข… ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

# -req : CSR์„ ์ž…๋ ฅ๋ฐ›์Œ
# -signkey : ์Šค์Šค๋กœ ์„œ๋ช…ํ•  ํ‚ค ์ง€์ •
openssl x509 -req -days 365 -in test.vn.csr -signkey test.vn.key -out test.vn.crt

# ์„ฑ๊ณต ์‹œ ์ถœ๋ ฅ ๋ฉ”์‹œ์ง€
Signature ok
subject=/C=VN/ST=Hanoi/L=lotte/O=admin/OU=admin/CN=*.test.vn
Getting Private key

์ตœ์ข… ํŒŒ์ผ ํ™•์ธ

์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ 3๊ฐœ์˜ ํŒŒ์ผ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • test.vn.key: ๊ฐœ์ธํ‚ค (ํŒจ์Šค์›Œ๋“œ ์ œ๊ฑฐ๋จ, ์„œ๋ฒ„ ์„ค์ •์— ์‚ฌ์šฉ)
  • test.vn.crt: ์ธ์ฆ์„œ (์„œ๋ฒ„ ์„ค์ •์— ์‚ฌ์šฉ)
  • test.vn.csr: ์‹ ์ฒญ์„œ (๋ฐœ๊ธ‰ ์™„๋ฃŒ ํ›„์—๋Š” ๋ถˆํ•„์š”)

4. Apache ์„ค์ • ๋ฐ ๊ฒ€์ฆ

์ƒ์„ฑ๋œ ํ‚ค์™€ ์ธ์ฆ์„œ๋ฅผ Apache ์„ค์ • ํŒŒ์ผ(httpd.conf ๋˜๋Š” ssl.conf)์— ๋“ฑ๋กํ•˜์—ฌ HTTPS๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ์ ์šฉ

# SSL ์—”์ง„ ํ™œ์„ฑํ™”
SSLEngine on

# 1. ์ธ์ฆ์„œ ํŒŒ์ผ ๊ฒฝ๋กœ ์ง€์ • (.crt)
SSLCertificateFile /etc/httpd/conf/ssl/test.vn.crt

# 2. ๊ฐœ์ธํ‚ค ํŒŒ์ผ ๊ฒฝ๋กœ ์ง€์ • (.key)
SSLCertificateKeyFile /etc/httpd/conf/ssl/test.vn.key

๊ฒ€์ฆ (Verification)

Apache๋ฅผ ์žฌ๊ธฐ๋™ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €๋กœ ์ ‘์†ํ•ด ๋ด…๋‹ˆ๋‹ค. ํŒจ์Šค์›Œ๋“œ๋ฅผ ๋ฌป์ง€ ์•Š๊ณ  ๊ธฐ๋™๋˜์–ด์•ผ ์ •์ƒ์ž…๋‹ˆ๋‹ค.

  1. ์žฌ๊ธฐ๋™: systemctl restart httpd
  2. ๋ธŒ๋ผ์šฐ์ € ์ ‘์†: https://test.vn
์ฃผ์˜ (Warning):
์‚ฌ์„ค ์ธ์ฆ์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹ ๋ขฐํ•˜๋Š” ๊ธฐ๊ด€(CA) ๋ชฉ๋ก์— ์—†์œผ๋ฏ€๋กœ, ์ ‘์† ์‹œ "์ฃผ์˜ ์š”ํ•จ" ๋˜๋Š” "์•ˆ์ „ํ•˜์ง€ ์•Š์Œ" ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๋Š” ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” ์˜ˆ์™ธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ง„ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

[JBoss/Apache] mod_cluster ์—ฐ๋™ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ๋™์  ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋ฐ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ์„ค์ •

JBoss EAP 6์™€ Apache HTTP Server๋ฅผ mod_cluster ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ •์ ์ธ ์„ค์ • ์—†์ด๋„ WAS์˜ ์ถ”๊ฐ€/์‚ญ์ œ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๋Š” ๋™์  ํด๋Ÿฌ์Šคํ„ฐ๋ง์„ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ(Advertise) ์„ค์ •์„ ์ค‘์‹ฌ์œผ๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ์‚ฌ์ „ ์ค€๋น„ (Prerequisites)

  • OS: Windows 10 (ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ)
  • Web Server: Apache 2.2.x (JBoss EWS ํฌํ•จ ๋ฒ„์ „ ๊ถŒ์žฅ)
  • Middleware: JBoss EAP 6.4.x
๋ฒ„์ „ ํ˜ธํ™˜์„ฑ ์ฃผ์˜: Apache ๋ฒ„์ „์— ๋งž๋Š” mod_cluster ๋ชจ๋“ˆ(.so)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. JBoss EWS(Enterprise Web Server) ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ ์ตœ์ ํ™”๋œ ๋ชจ๋“ˆ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

1. Apache ์„ค์ • (Web Server)

Apache์— mod_cluster ๊ด€๋ จ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ณ , JBoss๊ฐ€ ๋ณด๋‚ธ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

1) ํ•„์ˆ˜ ๋ชจ๋“ˆ ๋ณต์‚ฌ

JBoss EAP ์„ค์น˜ ๊ฒฝ๋กœ์— ํฌํ•จ๋œ mod_cluster ๊ด€๋ จ ๋ชจ๋“ˆ(.so)์„ Apache์˜ modules ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  • ์›๋ณธ ์œ„์น˜: [EAP_HOME]/modules/system/layers/base/native/lib64/httpd/modules
  • ๋ณต์‚ฌํ•  ํŒŒ์ผ:
    • mod_advertise.so
    • mod_manager.so
    • mod_proxy_cluster.so
    • mod_slotmem.so

2) mod_cluster.conf ์ž‘์„ฑ

httpd.conf์—์„œ include ํ•  ์„ค์ • ํŒŒ์ผ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•ต์‹ฌ์€ VirtualHost ๋‚ด์˜ ServerAdvertise On ์„ค์ •์ž…๋‹ˆ๋‹ค.

# ํ•„์ˆ˜ ๋ชจ๋“ˆ ๋กœ๋“œ (์ˆœ์„œ ์ค‘์š”)
LoadModule slotmem_module modules/mod_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule advertise_module modules/mod_advertise.so

# ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ํŒŒ์ผ ์œ„์น˜ ์ง€์ •
MemManagerFile "C:/Apache/logs/mod_cluster"


  # JBoss ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ Advertise ์ˆ˜์‹  ํฌํŠธ
  Listen 6666
  
    
      Order deny,allow
      Deny from all
      Allow from 127.0.0.1  # ๋ณด์•ˆ์ƒ ๋กœ์ปฌ ์ ‘๊ทผ๋งŒ ํ—ˆ์šฉ ๊ถŒ์žฅ
    
    
    # ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ๊ด‘๊ณ  ํ™œ์„ฑํ™” (ํ•ต์‹ฌ)
    ServerAdvertise on
    EnableMCPMReceive

    # ๊ด€๋ฆฌ ์ฝ˜์†” URL
    
      SetHandler mod_cluster-manager
      Order deny,allow
      Allow from all
    
  

2. JBoss ์„ค์ • (Middleware)

JBoss๊ฐ€ ๊ธฐ๋™๋  ๋•Œ ์ž์‹ ์˜ ์ •๋ณด๋ฅผ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ๋กœ ์ „ํŒŒํ•˜๊ฑฐ๋‚˜, ํ”„๋ก์‹œ(Apache) ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„์˜ค๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

1) Instance ID ์„ค์ • (domain.xml)

Sticky Session์„ ์œ„ํ•ด ๊ฐ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์— ๊ณ ์œ ํ•œ ID๋ฅผ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ${jboss.server.name} ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

<subsystem xmlns="urn:jboss:domain:web:2.2" default-virtual-server="default-host" instance-id="${jboss.server.name}" native="false">
    <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
    <connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp"/>
    ...
</subsystem>

2) ์†Œ์ผ“ ๋ฐ”์ธ๋”ฉ (Socket Binding) - ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ์ฃผ์†Œ

๋™์ผ ๋„คํŠธ์›Œํฌ ๋‚ด์— ์—ฌ๋Ÿฌ JBoss ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ํ˜ผ์„ ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ์ฃผ์†Œ๋‚˜ ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

domain.xml ์ˆ˜์ • (socket-binding-group):

<socket-binding-group name="full-ha-sockets" default-interface="public">
    
    ...
</socket-binding-group>
Tip: XML์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋™ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ(System Property)๋กœ ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
-Djboss.modcluster.multicast.address=224.10.1.1

3. ๊ฒ€์ฆ ๋ฐ ํ…Œ์ŠคํŠธ

์„ค์ • ์™„๋ฃŒ ํ›„ Apache -> JBoss ์ˆœ์„œ๋กœ ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค.

1) Apache ๊ด€๋ฆฌ ์ฝ˜์†” ์ ‘์†

๋ธŒ๋ผ์šฐ์ €์—์„œ http://[Apache_IP]:6666/mod_cluster_manager ๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

  • ์ •์ƒ: ํ•˜๋‹จ์— ์—ฐ๊ฒฐ๋œ JBoss Node(Node Name, IP, Port) ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
  • ์‹คํŒจ: ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ํ†ต์‹ ์ด ๋ฐฉํ™”๋ฒฝ์— ๋ง‰ํ˜€์žˆ๊ฑฐ๋‚˜, Advertise ์„ค์ •์ด ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2) ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋™์ž‘ ํ™•์ธ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ˜ธ์ถœ ์‹œ ์„ธ์…˜์ด ์œ ์ง€๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ํ•œ ์ชฝ ๋…ธ๋“œ๋ฅผ ์…ง๋‹ค์šด ์‹œ์ผฐ์„ ๋•Œ Failover๊ฐ€ ์ผ์–ด๋‚˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

mod_cluster manager screen

[๊ทธ๋ฆผ] mod_cluster ๋งค๋‹ˆ์ € ํ™”๋ฉด (๋…ธ๋“œ ์ธ์‹ ์„ฑ๊ณต)


Next Step:
๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด, mod_cluster ์„ค์ •์„ TCP ์œ ๋‹ˆ์บ์ŠคํŠธ(Proxy List ์ง€์ • ๋ฐฉ์‹)๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒ€ํ† ํ•ด ๋ณด์‹ญ์‹œ์˜ค.