[IHS/WAS] ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ IP(Real IP) ์‹๋ณ„ ๊ฐ€์ด๋“œ: mod_remoteip ์„ค์ • ๋ฐ ๋ฒ„์ „๋ณ„ ํŒจ์น˜ ํ˜„ํ™ฉ (9.0.5.13)

๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ(L4/L7) ํ™˜๊ฒฝ์—์„œ ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ IP๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด IBM HTTP Server(IHS) 9.0์˜ mod_remoteip๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ํŠนํžˆ ๋ณด์•ˆ ๊ฐ์‚ฌ ๋กœ๊ทธ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์œ„ํ•ด IHS 9.0.5.13 (APAR PH47286) ํŒจ์น˜๊ฐ€ ์™œ ์ค‘์š”ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ฒ„์ „๋ณ„ ๋กœ๊ทธ ํฌ๋งท ์„ค์ • ์ฐจ์ด์ ์„ ์ค‘์ ์ ์œผ๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ: ์™œ IP๊ฐ€ ๋ฐ”๋€”๊นŒ?

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ(Proxy)๋ฅผ ๊ฑฐ์ณ ์›น ์„œ๋ฒ„์— ์ ‘์†ํ•˜๋ฉด, ์›น ์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋Š” ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•œ ์ฃผ์ฒด๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์ด๋ฏ€๋กœ Source IP๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ IP(์˜ˆ: 10.0.0.1)๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

  • ์ ‘๊ทผ ์ œ์–ด ์‹คํŒจ: IP ๊ธฐ๋ฐ˜์˜ ACL(Access Control List) ์ ์šฉ ๋ถˆ๊ฐ€
  • ๊ฐ์‚ฌ ์ถ”์  ๋ถˆ๊ฐ€: ์‚ฌ๊ณ  ๋ฐœ์ƒ ์‹œ ์‹ค์ œ ๊ณต๊ฒฉ์ž์˜ IP๋ฅผ ๋กœ๊ทธ์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์Œ

1. ๋ฒ„์ „๋ณ„ ํŒจ์น˜ ๋ฐ ๋กœ๊ทธ ํฌ๋งท ์ฃผ์˜์‚ฌํ•ญ (Version History)

IHS ์„ค์ •์— ์•ž์„œ, ์‚ฌ์šฉ ์ค‘์ธ IHS ๋ฒ„์ „์— ๋”ฐ๋ผ ๋กœ๊ทธ ํฌ๋งท ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์จ์•ผ ํ•˜๋ฏ€๋กœ ๋ฒ„์ „ ํ™•์ธ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

๐Ÿ“ข ํ•ต์‹ฌ ํŒจ์น˜ ์ •๋ณด: APAR PH47286

์ ์šฉ ๋ฒ„์ „: IBM HTTP Server 9.0.5.13 ์ด์ƒ

๋‚ด์šฉ: ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” mod_remoteip๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•ด๋„, ๊ธฐ๋ณธ ๋กœ๊ทธ ๋ณ€์ˆ˜์ธ %h๊ฐ€ ์—ฌ์ „ํžˆ ํ”„๋ก์‹œ IP๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 9.0.5.13๋ถ€ํ„ฐ๋Š” %h๊ฐ€ mod_remoteip์— ์˜ํ•ด ๋ณ€๊ฒฝ๋œ ์‹ค์ œ IP๋ฅผ ๋ฐ˜์˜ํ•˜๋„๋ก ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „๋ณ„ ๊ถŒ์žฅ ๋กœ๊ทธ ํฌ๋งท

IHS ๋ฒ„์ „ Access Log ๊ถŒ์žฅ ๋ณ€์ˆ˜ ์„ค๋ช…
9.0.5.12 ์ดํ•˜ %a (Client IP) %h๋Š” ํ”„๋ก์‹œ IP๋ฅผ ์ฐ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ ๊ธˆ์ง€. ๋ฐ˜๋“œ์‹œ %a ์‚ฌ์šฉ.
9.0.5.13 ์ด์ƒ %h ๋˜๋Š” %a ํŒจ์น˜ ์ ์šฉ๋จ. %h๋ฅผ ์จ๋„ ์‹ค์ œ IP๊ฐ€ ๊ธฐ๋ก๋จ (๊ธฐ์กด ์„ค์ • ์œ ์ง€ ๊ฐ€๋Šฅ).

2. IHS ์„ค์ • ๊ฐ€์ด๋“œ (httpd.conf)

Step 1: ๋ชจ๋“ˆ ํ™œ์„ฑํ™”

# mod_remoteip ๋ชจ๋“ˆ ์ฃผ์„ ํ•ด์ œ
LoadModule remoteip_module modules/mod_remoteip.so

Step 2: ์‹ ๋ขฐํ•  ํ”„๋ก์‹œ ๋“ฑ๋ก

๋ณด์•ˆ์„ ์œ„ํ•ด "๋ˆ„๊ฐ€ ๋ณด๋‚ด์ค€ ํ—ค๋”๋ฅผ ๋ฏฟ์„ ๊ฒƒ์ธ๊ฐ€"๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด ํ—ค๋”๋‚˜ ๋ฏฟ์œผ๋ฉด IP ์Šคํ‘ธํ•‘ ๊ณต๊ฒฉ์— ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<IfModule mod_remoteip.c>
    # 1. ์‹ค์ œ IP๊ฐ€ ๋‹ด๊ธด ํ—ค๋”๋ช… ์ง€์ • (ํ‘œ์ค€: X-Forwarded-For)
    RemoteIPHeader X-Forwarded-For

    # 2. ์‹ ๋ขฐํ•  ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ(L4/L7) IP ๋“ฑ๋ก
    # ์‚ฌ์„ค IP ๋Œ€์—ญ์˜ ํ”„๋ก์‹œ์ธ ๊ฒฝ์šฐ (10.x, 192.168.x ๋“ฑ)
    RemoteIPInternalProxy 10.0.0.1 10.0.0.2

    # ๊ณต์ธ IP ๋Œ€์—ญ์˜ ํ”„๋ก์‹œ์ธ ๊ฒฝ์šฐ
    # RemoteIPTrustedProxy 203.0.113.5
</IfModule>

Step 3: ๋กœ๊ทธ ํฌ๋งท ๋ณ€๊ฒฝ (Access Log)

๋ฒ„์ „์— ๊ด€๊ณ„์—†์ด ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ %a ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

# [๊ธฐ์กด] common ํฌ๋งท (9.0.5.12 ์ดํ•˜์—์„œ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ)
# LogFormat "%h %l %u %t \"%r\" %>s %b" common

# [๋ณ€๊ฒฝ] %h -> %a ๋กœ ๋ณ€๊ฒฝ (๊ถŒ์žฅ)
LogFormat "%a %l %u %t \"%r\" %>s %b" common

3. ๊ฒ€์ฆ ๋ฐ ๋””๋ฒ„๊น… (Validation)

์„ค์ • ์ ์šฉ ํ›„ ์‹ค์ œ๋กœ ํ—ค๋”๊ฐ€ ์ž˜ ๋ณ€ํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ž„์‹œ๋กœ ๋กœ๊ทธ๋ฅผ ์ƒ์„ธํ•˜๊ฒŒ ์ฐ์–ด๋ด…๋‹ˆ๋‹ค.

# ๋””๋ฒ„๊น…์šฉ ๋กœ๊ทธ ํฌ๋งท ์ •์˜ (์ž‘์—… ํ›„ ์ฃผ์„ ์ฒ˜๋ฆฌ ๊ถŒ์žฅ)
# %{c}a : Connection IP (L4 IP)
# %a    : Client IP (๋ณ€ํ™˜๋œ ์‹ค์ œ IP)
GlobalLog logs/remoteip_debug.log "L4-IP=%{c}a Real-IP=%a XFF-Header=%{X-Forwarded-For}i"

์ •์ƒ ๊ฒฐ๊ณผ ์˜ˆ์‹œ:

L4-IP=10.0.0.1 Real-IP=203.0.113.2 XFF-Header=203.0.113.2
  • L4-IP์—๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ IP๊ฐ€ ๋‚˜์™€์•ผ ํ•จ
  • Real-IP์—๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž PC์˜ IP๊ฐ€ ๋‚˜์™€์•ผ ํ•จ (์„ฑ๊ณต)

4. WAS(WebSphere) ์ถ”๊ฐ€ ์„ค์ • ํ•„์š” ์—ฌ๋ถ€

IHS์—์„œ mod_remoteip๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•˜๋ฉด, WAS ํ”Œ๋Ÿฌ๊ทธ์ธ(Plugin)์œผ๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ ์ด๋ฏธ Source IP๊ฐ€ ๋ณต์›๋œ ์ƒํƒœ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ WAS ์ชฝ์—์„œ๋Š” ๋ณ„๋„์˜ ์ถ”๊ฐ€ ์„ค์ • ์—†์ด request.getRemoteAddr() ํ˜ธ์ถœ ์‹œ ์‹ค์ œ IP๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๋‹จ, Plugin ์„ค์ •์˜ TrustedProxyEnable ์†์„ฑ์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

[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 ๋ช…๋ น์–ด๋กœ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žฌ๊ธฐ๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[IBM HTTPServer] SSL ์ธ์ฆ์„œ ์ ์šฉ ๊ฐ€์ด๋“œ: PEM → P12 → KDB ๋ณ€ํ™˜ ๋ฐ gskcapicmd ์‚ฌ์šฉ๋ฒ•

์ผ๋ฐ˜์ ์ธ ์ธ์ฆ์„œ ํŒŒ์ผ(PEM/Key)์„ IBM HTTP Server(IHS)์—์„œ ์‚ฌ์šฉํ•˜๋Š” CMS ํ‚ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(KDB) ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. OpenSSL์„ ์ด์šฉํ•ด P12๋กœ 1์ฐจ ๋ณ€ํ™˜ ํ›„, IBM GSKit(gskcapicmd)์„ ์ด์šฉํ•ด KDB๋กœ ์ตœ์ข… ๋ณ€ํ™˜ ๋ฐ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ํ”„๋กœ์„ธ์Šค (Workflow)

IHS๋Š” OpenSSL ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ IBM ๊ณ ์œ ์˜ ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(GSKit)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณ€ํ™˜ ๊ณผ์ •์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

  • Step 1: .key + .pem.p12 (OpenSSL ์‚ฌ์šฉ)
  • Step 2: .p12.kdb (gskcapicmd ์‚ฌ์šฉ)

Test Environment

  • OS: Linux / Unix
  • Web Server: IBM HTTP Server v9.0 (v8.5 ์ด์ƒ ๋™์ผ)
  • Tool: OpenSSL, gskcapicmd (IHS bin ํด๋” ๋‚ด์žฅ)

1. PEM์„ P12๋กœ ๋ณ€ํ™˜ (OpenSSL)

๊ฐœ์ธํ‚ค(Private Key)์™€ ์ธ์ฆ์„œ(Certificate)๋ฅผ ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€ ํฌ๋งท์ธ PKCS#12(.p12)๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

# ๊ตฌ๋ฌธ: openssl pkcs12 -export -inkey [๊ฐœ์ธํ‚ค] -in [์ธ์ฆ์„œ] -out [์ถœ๋ ฅํŒŒ์ผ๋ช…]
openssl pkcs12 -export -inkey Wildcard.test.co.kr.key -in Wildcard.test.co.kr.pem -out Wildcard.test.co.kr.p12
์ฃผ์˜ (Password):
๋ช…๋ น์–ด ์‹คํ–‰ ์‹œ Export Password๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ KDB๋กœ ์ž„ํฌํŠธํ•  ๋•Œ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. P12๋ฅผ KDB๋กœ ๋ณ€ํ™˜ (GSKit)

IHS์˜ bin ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” gskcapicmd(๋˜๋Š” gskcmd)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

2-1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • (ํ•„์ˆ˜)

GSKit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์žก์•„์ฃผ์–ด์•ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

# IHS ์„ค์น˜ ๊ฒฝ๋กœ ์˜ˆ์‹œ (/sw/web/IHS9)
export LD_LIBRARY_PATH=/sw/web/IHS9/lib:$LD_LIBRARY_PATH
cd /sw/web/IHS9/bin

2-2. ์‹ ๊ทœ KDB ์ƒ์„ฑ (์—†๋Š” ๊ฒฝ์šฐ)

๊ธฐ์กด KDB๊ฐ€ ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. -stash ์˜ต์…˜์€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํŒŒ์ผ(.sth)๋กœ ์ €์žฅํ•˜์—ฌ ์›น ์„œ๋ฒ„ ๊ธฐ๋™ ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.

./gskcapicmd -keydb -create -db key.kdb -pw [KDBํŒจ์Šค์›Œ๋“œ] -type cms -stash

2-3. P12 ํŒŒ์ผ ์ž„ํฌํŠธ (Import)

์ƒ์„ฑ๋œ(๋˜๋Š” ๊ธฐ์กด) KDB ํŒŒ์ผ์— ์œ„์—์„œ ๋งŒ๋“  P12 ์ธ์ฆ์„œ๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.

./gskcapicmd -cert -import \
-db /sw/img/Wildcard.test.co.kr.p12 -pw [P12ํŒจ์Šค์›Œ๋“œ] \
-target key.kdb -target_pw [KDBํŒจ์Šค์›Œ๋“œ] \
-label "*.test.co.kr"
์ฐธ๊ณ  (Export vs Import):
์งˆ๋ฌธํ•˜์‹  ๋‚ด์šฉ ์ค‘ -export๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ P12๋ฅผ KDB๋กœ ๋ฐ”๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์‹ค๋ฌด์—์„œ๋Š” ๊ธฐ์กด KDB์— ์ธ์ฆ์„œ๋ฅผ ์ถ”๊ฐ€(Import)ํ•˜๊ฑฐ๋‚˜ ๊ฐฑ์‹ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ -import ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

3. ๊ธฐ๋ณธ ์ธ์ฆ์„œ ์„ค์ • ๋ฐ ๊ฒ€์ฆ

KDB ์•ˆ์— ์—ฌ๋Ÿฌ ์ธ์ฆ์„œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์–ด๋–ค ์ธ์ฆ์„œ๋ฅผ ๋ฉ”์ธ์œผ๋กœ ์‚ฌ์šฉํ• ์ง€ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ธ์ฆ์„œ ์ง€์ • (Set Default)

./gskcapicmd -cert -setdefault -db key.kdb -pw [KDBํŒจ์Šค์›Œ๋“œ] -label "*.test.co.kr"

๊ฒ€์ฆ (List & Details)

KDB ๋‚ด์˜ ์ธ์ฆ์„œ ๋ชฉ๋ก๊ณผ ์œ ํšจ๊ธฐ๊ฐ„์„ ํ™•์ธํ•˜์—ฌ ์ž‘์—…์ด ์ •์ƒ์ ์œผ๋กœ ๋˜์—ˆ๋Š”์ง€ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค.

# ์ธ์ฆ์„œ ๋ชฉ๋ก ํ™•์ธ (Default๋Š” * ๋˜๋Š” > ํ‘œ์‹œ๊ฐ€ ๋ถ™์Œ)
./gskcapicmd -cert -list -db key.kdb -pw [KDBํŒจ์Šค์›Œ๋“œ]

# ํŠน์ • ์ธ์ฆ์„œ ์ƒ์„ธ ์ •๋ณด ํ™•์ธ
./gskcapicmd -cert -details -db key.kdb -pw [KDBํŒจ์Šค์›Œ๋“œ] -label "*.test.co.kr"

Next Step:
key.kdb ํŒŒ์ผ๊ณผ key.sth(Stash) ํŒŒ์ผ์„ httpd.conf์˜ KeyFile ๊ฒฝ๋กœ์— ์œ„์น˜์‹œํ‚ค๊ณ  IHS๋ฅผ ์žฌ๊ธฐ๋™ํ•˜๋ฉด SSL ์ ์šฉ์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

[WebSphere] WAS v9.0 CLI ์„ค์น˜ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: IM, WAS, IHS, Plugin ๋ฐ JDK 8 ๋™์‹œ ์„ค์น˜

CentOS 7 ํ™˜๊ฒฝ์—์„œ GUI ์—†์ด imcl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WebSphere v9.0.5.1์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. v9.0๋ถ€ํ„ฐ ๋ณ€๊ฒฝ๋œ ์ •์ฑ…์— ๋”ฐ๋ผ JDK 8์„ ๋ฐ˜๋“œ์‹œ ํ•จ๊ป˜ ์„ค์น˜ํ•ด์•ผ ํ•จ์„ ๊ฐ•์กฐํ•˜๋ฉฐ, WAS, IHS, Plugin ์„ค์น˜ ๋ฐ ํŒจ์น˜ ์ ์šฉ ๋ช…๋ น์–ด๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7 (3.10.0-957.el7.x86_64)
  • Installer: IBM Installation Manager (IM) 1.8.x ์ด์ƒ
  • Target Version: WebSphere Application Server 9.0.5.1

1. Installation Manager (IM) ์„ค์น˜

IBM ์ œํ’ˆ๊ตฐ์„ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ธ IM์„ ๋จผ์ € ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. -repositories์—๋Š” repository.config ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜ ๋ช…๋ น์–ด

# ์„ค์น˜ ๊ฒฝ๋กœ๋กœ ์ด๋™
cd /sw/img/im

# IM ์„ค์น˜ ์‹คํ–‰
./imcl install com.ibm.cic.agent \
-repositories "/sw/img/im/repository.config" \
-installationDirectory "/sw/IBM/InstallationManager/eclipse" \
-sharedResourcesDirectory "/sw/IBM/IMShared" \
-acceptLicense \
-showProgress -sP
Tip (ํŒจํ‚ค์ง€ ID ํ™•์ธ):
์„ค์น˜ํ•˜๋ ค๋Š” ์ œํ’ˆ์˜ ์ •ํ™•ํ•œ ID(์˜ˆ: com.ibm.websphere...)๋ฅผ ๋ชจ๋ฅธ๋‹ค๋ฉด ์„ค์น˜ ๋ฏธ๋””์–ด ๋‚ด์˜ Offerings ํด๋”๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ./imcl listAvailablePackages -repositories [๊ฒฝ๋กœ] ๋ช…๋ น์–ด๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. WebSphere Application Server (WAS) ์„ค์น˜

์ค‘์š”: WAS v9.0์€ ๊ธฐ๋ณธ JDK๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ com.ibm.websphere.BASE... ํŒจํ‚ค์ง€์™€ com.ibm.java.jdk.v8... ํŒจํ‚ค์ง€๋ฅผ ๋™์‹œ์— ์ง€์ •ํ•˜์—ฌ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜ ๋ช…๋ น์–ด (Base + JDK 8)

์„ค์น˜ ๋„๊ตฌ(tools) ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

cd /sw/IBM/InstallationManager/eclipse/tools

# WAS ๋ฐ JDK ๋™์‹œ ์„ค์น˜
./imcl install com.ibm.websphere.BASE.v90_9.0.5001.20190828_0616 \
com.ibm.java.jdk.v8_8.0.5041.20190924_1031 \
-repositories "/sw/img/base","/sw/img/sdk" \
-installationDirectory "/sw/was/AppServer9" \
-sharedResourcesDirectory "/sw/IBM/IMShared" \
-acceptLicense \
-properties cic.selector.nl=ko \
-showProgress -sP

Fix Pack ์—…๋ฐ์ดํŠธ (Optional)

์„ค์น˜ ํ›„ ํŠน์ • ํ”ฝ์ŠคํŒฉ(์˜ˆ: 9.0.5.3)์œผ๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

./imcl install com.ibm.websphere.BASE.v90_9.0.5003.20200226_0941 \
-repositories "/sw/img/fixwas" \
-installationDirectory "/sw/was/AppServer9" \
-acceptLicense -sP

3. IBM HTTP Server (IHS) ์„ค์น˜

์›น ์„œ๋ฒ„์ธ IHS๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ JDK ์„ค์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. user.ihs.httpPort ์†์„ฑ์œผ๋กœ ๊ธฐ๋ณธ ํฌํŠธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# IHS ๋ฐ JDK ๋™์‹œ ์„ค์น˜
./imcl install com.ibm.websphere.IHS.v90_9.0.5001.20190828_0616 \
com.ibm.java.jdk.v8_8.0.5041.20190924_1031 \
-repositories "/sw/img/ihs","/sw/img/sdk" \
-installationDirectory "/sw/web/IHS9" \
-sharedResourcesDirectory "/sw/IBM/IMShared" \
-acceptLicense \
-properties user.ihs.httpPort="80" \
-showProgress -sP

4. Web Server Plugin (PLG) ์„ค์น˜

WAS์™€ ์›น ์„œ๋ฒ„๋ฅผ ์—ฐ๋™ํ•ด์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

# Plugin ๋ฐ JDK ๋™์‹œ ์„ค์น˜
./imcl install com.ibm.websphere.PLG.v90_9.0.5001.20190828_0616 \
com.ibm.java.jdk.v8_8.0.5041.20190924_1031 \
-repositories "/sw/img/plg","/sw/img/sdk" \
-installationDirectory "/sw/web/Plugins9" \
-sharedResourcesDirectory "/sw/IBM/IMShared" \
-acceptLicense \
-showProgress -sP

5. ์„ค์น˜ ๊ฒ€์ฆ (Verification)

๋ชจ๋“  ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ชฉ๋ก๊ณผ ์ƒ์„ธ ๋ฒ„์ „์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ชฉ๋ก ํ™•์ธ

# IM ๋ช…๋ น์–ด๋กœ ํ™•์ธ
./imcl listInstalledPackages

์ƒ์„ธ ๋ฒ„์ „ ๋ฆฌํฌํŠธ ํ™•์ธ

WAS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋กœ ์ƒ์„ธ ๋ฆฌํฌํŠธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

# WAS ํ™ˆ์˜ bin ๋””๋ ‰ํ† ๋ฆฌ
/sw/was/AppServer9/bin/versionInfo.sh

Next Step:
์—”์ง„ ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ manageprofiles.sh ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ๊ตฌ๋™ํ•  ํ”„๋กœํŒŒ์ผ(Profile)์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[WebSphere/IHS] ๋ณด์•ˆ ์ทจ์•ฝ์  ์กฐ์น˜: Server ํ—ค๋” ์ˆจ๊ธฐ๊ธฐ ๋ฐ ๋ฒ„์ „ ์ •๋ณด ๋…ธ์ถœ ๋ฐฉ์ง€ ์ „๋žต

HTTP ์‘๋‹ต ํ—ค๋”์˜ Server ํ•„๋“œ(์˜ˆ: Apache/2.4, WebSphere Application Server/8.5)๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์˜ ์ข…๋ฅ˜์™€ ๋ฒ„์ „์ด ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•ž๋‹จ์˜ IBM HTTP Server(IHS)์™€ ๋’ท๋‹จ์˜ WebSphere(WAS) ์–‘์ชฝ ๋ชจ๋‘์˜ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

์„œ๋ฒ„์˜ ๊ตฌ์ฒด์ ์ธ ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜๋ฉด, ํ•ด์ปค๋Š” ํ•ด๋‹น ๋ฒ„์ „์— ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ (CVE)์„ ์ฐพ์•„ ๋งž์ถคํ˜• ๊ณต๊ฒฉ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณด์•ˆ ๋ชจ๋ฒ” ์‚ฌ๋ก€(Best Practice)์—์„œ๋Š” ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ์ตœ์†Œํ™”ํ•  ๊ฒƒ์„ ๊ถŒ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Web Server: IBM HTTP Server (Apache ๊ธฐ๋ฐ˜)
  • WAS: WebSphere Application Server v8.5

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

๊ฐ€์žฅ ์•ž๋‹จ์—์„œ ์š”์ฒญ์„ ๋ฐ›๋Š” ์›น ์„œ๋ฒ„์˜ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. httpd.conf ํŒŒ์ผ์— ์•„๋ž˜ ์ง€์‹œ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๋‚ด์šฉ (httpd.conf)

# 1. ์„œ๋ฒ„ ์ •๋ณด ์ตœ์†Œํ™” (Apache/x.y.z -> Apache)
ServerTokens Prod

# 2. ์—๋Ÿฌ ํŽ˜์ด์ง€ ํ•˜๋‹จ(Footer)์— ์„œ๋ฒ„ ์ •๋ณด ์ˆจ๊น€
ServerSignature Off

# 3. Server ํ—ค๋” ์ž์ฒด๋ฅผ ์‘๋‹ต์—์„œ ์ œ๊ฑฐ (IHS ์ „์šฉ ๊ธฐ๋Šฅ, ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ ๊ถŒ์žฅ)
AddServerHeader Off
Tip: AddServerHeader Off๋Š” ํ‘œ์ค€ Apache์—๋Š” ์—†๊ณ  IBM HTTP Server์—๋งŒ ์กด์žฌํ•˜๋Š” ์ง€์‹œ์–ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์šฉ ํ›„ Syntax Error๊ฐ€ ๋‚œ๋‹ค๋ฉด ServerTokens Prod๊นŒ์ง€๋งŒ ์ ์šฉํ•˜์‹ญ์‹œ์˜ค.

2. WebSphere (WAS) ์„ค์ •

WAS๊ฐ€ ์ง์ ‘ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ์ค„ ๋•Œ ๋ถ™๋Š” ํ—ค๋”๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. WAS v8.5.0.2 ์ด์ƒ๋ถ€ํ„ฐ๋Š” ๊ธฐ๋ณธ ๋™์ž‘์ด ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋‚˜, ๋ช…์‹œ์ ์œผ๋กœ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด HTTP ์ „์†ก ์ฑ„๋„(Transport Channel) ์„ค์ •์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๊ฒฝ๋กœ

์„œ๋ฒ„ > WebSphere Application Server > [์„œ๋ฒ„๋ช…] > ์›น ์ปจํ…Œ์ด๋„ˆ ์„ค์ • > ์›น ์ปจํ…Œ์ด๋„ˆ ์ „์†ก ์ฒด์ธ > WCInboundDefault > HTTP ์ธ๋ฐ”์šด๋“œ ์ฑ„๋„ (HTTP_2) > ์‚ฌ์šฉ์ž ์ •์˜ ํŠน์„ฑ (Custom properties)

์ฃผ์š” ์†์„ฑ (ํƒ 1)

์ƒํ™ฉ์— ๋งž์ถฐ ์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ์†์„ฑ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ์ด๋ฆ„ (Name) ์„ค๋ช… ๋ฐ ๊ถŒ์žฅ ๊ฐ’
RemoveServerHeader ๊ฐ’: true
Server ํ—ค๋” ์ž์ฒด๋ฅผ ์•„์˜ˆ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ์„ค์ •์ž…๋‹ˆ๋‹ค.
ServerHeaderValue ๊ฐ’: (์ž„์˜์˜ ๋ฌธ์ž์—ด)
๊ธฐ๋ณธ๊ฐ’์ธ "WebSphere Application Server..." ๋Œ€์‹  ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ฌธ์ž์—ด(์˜ˆ: "AppServer")๋กœ ์น˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ฐธ๊ณ  (WebContainer ์†์„ฑ):
์ „์†ก ์ฑ„๋„ ์„ค์ • ์™ธ์—๋„, ์›น ์ปจํ…Œ์ด๋„ˆ > ์‚ฌ์šฉ์ž ์ •์˜ ํŠน์„ฑ์—์„œ com.ibm.ws.webcontainer.disableServerHeader ๊ฐ’์„ true๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. (์ตœ์‹  ๋ฒ„์ „์—์„œ ๊ถŒ์žฅ)

3. ๊ฒ€์ฆ (Verification)

IHS์™€ WAS๋ฅผ ๋ชจ๋‘ ์žฌ๊ธฐ๋™ํ•œ ํ›„, curl ๋ช…๋ น์–ด๋กœ ์‘๋‹ต ํ—ค๋”๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

# ํ—ค๋” ํ™•์ธ
curl -I http://localhost/

# [Before]
HTTP/1.1 200 OK
Server: IBM_HTTP_Server/8.5 ...
...

# [After] 
HTTP/1.1 200 OK
# Server ํ—ค๋”๊ฐ€ ์•„์˜ˆ ์—†๊ฑฐ๋‚˜ "Apache" ๋˜๋Š” ์ง€์ •ํ•œ ๊ฐ’์œผ๋กœ ํ‘œ์‹œ๋จ
...

Next Step:
ํ—ค๋” ์ˆจ๊น€ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ๋Š” HTTP ๋ฉ”์†Œ๋“œ(PUT, DELETE, TRACE) ์ฐจ๋‹จ ์„ค์ •์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์„ ๋ง‰๋Š” ์›น ์„œ๋ฒ„ ๊ฐ•ํ™” ์ž‘์—…์„ ์ง„ํ–‰ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[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 ๋“ฑ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[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)

[IHS/Apache] ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•œ ๋ถˆํ•„์š” HTTP Method(PUT, DELETE, TRACE) ์ฐจ๋‹จ ์„ค์ •

์›น ์„œ๋ฒ„ ์šด์˜ ์‹œ ๋ณด์•ˆ ์ทจ์•ฝ์ (ํŒŒ์ผ ๋ณ€์กฐ, ์ •๋ณด ๋…ธ์ถœ ๋“ฑ)์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด GET, POST๋ฅผ ์ œ์™ธํ•œ ๋ถˆํ•„์š”ํ•œ HTTP Method(PUT, DELETE, TRACE, OPTIONS)๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. IBM HTTP Server(Apache) ์„ค์ •๊ณผ WAS(web.xml) ์„ค์ • ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

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

๊ธฐ๋ณธ์ ์œผ๋กœ ์›น ์„œ๋ฒ„๋Š” ๋‹ค์–‘ํ•œ HTTP Method๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ GET๊ณผ POST๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์—ด์–ด๋‘˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • PUT, DELETE: ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„์˜ ํŒŒ์ผ์„ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Œ.
  • TRACE: XST(Cross-Site Tracing) ๊ณต๊ฒฉ์— ์•…์šฉ๋˜์–ด ์ฟ ํ‚ค/์„ธ์…˜ ์ •๋ณด๊ฐ€ ํƒˆ์ทจ๋  ์ˆ˜ ์žˆ์Œ.
  • OPTIONS: ์„œ๋ฒ„๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•จ.

Test Environment

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

1. Web Server ๋ ˆ๋ฒจ ์ฐจ๋‹จ (httpd.conf)

๊ฐ€์žฅ ์•ž๋‹จ์˜ ์›น ์„œ๋ฒ„์—์„œ ์›์ฒœ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์ด ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ฅผ ๋ง‰๊ณ  ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ์ ์šฉํ•˜์‹ญ์‹œ์˜ค.

Method A: LimitExcept ์ง€์‹œ์–ด ์‚ฌ์šฉ (๊ถŒ์žฅ)

ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ๋‚˜ URL ํŒจํ„ด์— ๋Œ€ํ•ด ํ—ˆ์šฉํ•  ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ฑฐ๋ถ€ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

# 1. ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ ๊ธฐ์ค€ ์ฐจ๋‹จ
<Directory "/WAS/htdocs">
    Options FollowSymLinks
    AllowOverride None
    
    # GET, POST๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ ๊ฑฐ๋ถ€
    <LimitExcept GET POST>
        Order allow,deny
        Deny from all
    </LimitExcept>
</Directory>

# 2. ์ „์—ญ(URL) ๊ธฐ์ค€ ์ฐจ๋‹จ (Directory ์„ค์ •์ด ๋ชจํ˜ธํ•  ๋•Œ)
<Location "/*">
    <LimitExcept GET POST>
        Order allow,deny
        Deny from all
    </LimitExcept>
</Location>
๋ฒ„์ „๋ณ„ ๋ฌธ๋ฒ• ์ฃผ์˜ (Note):
IHS v8.5(Apache 2.2)๋Š” Order/Deny๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, IHS v9.0(Apache 2.4) ์ด์ƒ์—์„œ๋Š” Require all denied ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Method B: Mod_Rewrite ์‚ฌ์šฉ

mod_rewrite ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์†Œ๋“œ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜๊ณ  ๊ฐ•์ œ๋กœ ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

LoadModule rewrite_module modules/mod_rewrite.so

<IfModule mod_rewrite.c>
    RewriteEngine On
    
    # ์กฐ๊ฑด: ์š”์ฒญ ๋ฉ”์†Œ๋“œ๊ฐ€ GET ๋˜๋Š” POST๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด
    RewriteCond %{REQUEST_METHOD} !^(GET|POST)
    
    # ๊ทœ์น™: 405 (Method Not Allowed) ์—๋Ÿฌ ๋ฐ˜ํ™˜
    RewriteRule .* - [R=405,L]
</IfModule>

2. WAS ๋ ˆ๋ฒจ ์ฐจ๋‹จ (web.xml)

์›น ์„œ๋ฒ„ ์„ค์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(WAR) ๋‹จ์œ„๋กœ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ‘œ์ค€ ๋ฐฐํฌ ์„œ์ˆ ์ž(web.xml)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๋ฐฉ๋ฒ•

web.xml์— security-constraint๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํŠน์ • ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Restricted Methods</web-resource-name>
        <url-pattern>/*</url-pattern>
        
        <!-- ์ฐจ๋‹จํ•  ๋ฉ”์†Œ๋“œ ๋ช…์‹œ -->
        <http-method>PUT</http-method>
        <http-method>DELETE</http-method>
        <http-method>TRACE</http-method>
        <http-method>OPTIONS</http-method>
        <http-method>HEAD</http-method>
    </web-resource-collection>
    
    <!-- ์ค‘์š”: auth-constraint๋ฅผ ๋น„์›Œ๋‘๋ฉด ๋ˆ„๊ตฌ์—๊ฒŒ๋„ ๊ถŒํ•œ์„ ์ฃผ์ง€ ์•Š์Œ(์ฐจ๋‹จ) -->
    <auth-constraint />
</security-constraint>

3. ๊ฒ€์ฆ (Verification)

์„ค์ • ์ ์šฉ ํ›„ ๋ฐ˜๋“œ์‹œ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ฐจ๋‹จ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. telnet ๋˜๋Š” curl์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Telnet์„ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ

$ telnet localhost 80
Trying ::1...
Connected to localhost.
Escape character is '^]'.

# OPTIONS ๋ฉ”์†Œ๋“œ ์š”์ฒญ ์ž…๋ ฅ
OPTIONS / HTTP/1.0
Host: localhost
(์—”ํ„ฐ ๋‘ ๋ฒˆ)

# ๊ฒฐ๊ณผ ํ™•์ธ (403 Forbidden ๋˜๋Š” 405 Method Not Allowed ํ™•์ธ)
HTTP/1.1 403 Forbidden
Date: Wed, 04 Jul 2018 01:44:40 GMT
...

Curl์„ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ (๊ฐ„ํŽธ)

# -X ์˜ต์…˜์œผ๋กœ ๋ฉ”์†Œ๋“œ ์ง€์ •, -I ์˜ต์…˜์œผ๋กœ ํ—ค๋”๋งŒ ํ™•์ธ
curl -v -X OPTIONS http://localhost/

# ๊ฒฐ๊ณผ: < HTTP/1.1 403 Forbidden ํ™•์ธ

Next Step:
๋ฉ”์†Œ๋“œ ์ฐจ๋‹จ ์™ธ์—๋„ ServerTokens Prod ์„ค์ •์„ ํ†ตํ•ด ํ—ค๋”์— ๋…ธ์ถœ๋˜๋Š” ์›น ์„œ๋ฒ„ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๋Š” ๋ณด์•ˆ ์กฐ์น˜๋ฅผ ์ถ”๊ฐ€๋กœ ๊ฒ€ํ† ํ•ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

[IBM HTTP Server ] IBM HTTP Server v8.5 vs v9.0: Apache Base Version ํ™•์ธ ๋ฐ ์ฐจ์ด์  (Apache 2.2 vs 2.4)

IBM HTTP Server(IHS)๋Š” Apache HTTP Server๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. IHS v8.5(Apache 2.2 ๊ธฐ๋ฐ˜)์™€ IHS v9.0(Apache 2.4 ๊ธฐ๋ฐ˜)์˜ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ , ์—”์ง„ ์—…๊ทธ๋ ˆ์ด๋“œ์— ๋”ฐ๋ฅธ ์„ค์ • ํŒŒ์ผ(httpd.conf) ํ˜ธํ™˜์„ฑ ์ฃผ์˜์‚ฌํ•ญ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. ๋ฒ„์ „ ํ™•์ธ ๋ฐฉ๋ฒ• (Check Version)

IHS์˜ ์‹คํ–‰ ํŒŒ์ผ(apache.exe ๋˜๋Š” httpd)์— -V ์˜ต์…˜์„ ์ฃผ์–ด ์ปดํŒŒ์ผ ์˜ต์…˜๊ณผ ๊ธฐ๋ฐ˜ ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…๋ น์–ด

# Windows
cd [IHS_HOME]\bin
.\apache.exe -V

# Linux/Unix
cd [IHS_HOME]/bin
./apachectl -V

2. ๋ฒ„์ „๋ณ„ ์ƒ์„ธ ์ •๋ณด (Output Analysis)

IHS v8.5 (Apache 2.2 Base)

IHS 8.5.5๋Š” Apache 2.2.8 ๋ฒ„์ „์„ ๋ฒ ์ด์Šค๋กœ ํ•˜์—ฌ IBM์˜ ์ถ”๊ฐ€์ ์ธ ํŒจ์น˜์™€ ๋ณด์•ˆ ์ˆ˜์ •์ด ์ ์šฉ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

PS E:\app\was\HTTPServer\bin> .\apache.exe -V
Server version: IBM_HTTP_Server/8.5.5.0 (Win32)
Apache version: 2.2.8 (with additional fixes)  <-- Check Point
Server built:   Feb 20 2013 13:50:05
Architecture:   32-bit
Server MPM:     WinNT
  threaded:     yes (fixed thread count)
  forked:       no
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/winnt"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D HTTPD_ROOT="/apache"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

IHS v9.0 (Apache 2.4 Base)

IHS 9.0์€ Apache 2.4.12 ๋ฒ„์ „์„ ๋ฒ ์ด์Šค๋กœ ํ•ฉ๋‹ˆ๋‹ค. Apache 2.4๋กœ ๋„˜์–ด์˜ค๋ฉด์„œ ์„ฑ๋Šฅ ๊ฐœ์„ (Event MPM ๋“ฑ)๊ณผ ์„ค์ • ๋ฌธ๋ฒ•์˜ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

PS E:\software\IBM\HTTPServer9\bin> .\apache.exe -V
Server version: IBM_HTTP_Server/9.0.0.0-PI56034 (Win32)
Apache version: 2.4.12 (with additional fixes) <-- Check Point
Server built:   Apr 18 2016 20:28:53
Architecture:   32-bit
Server MPM:     WinNT
  threaded:     yes (fixed thread count)
  forked:       no
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/apache"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

3. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ฃผ์˜์‚ฌํ•ญ (Apache 2.2 vs 2.4)

IHS v8.5์—์„œ v9.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ ๊ฐ€์žฅ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ์ ‘๊ทผ ์ œ์–ด(Access Control) ๊ตฌ๋ฌธ์˜ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด httpd.conf๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๋ณ€๊ฒฝ ์  ๋น„๊ต

๊ตฌ๋ถ„ IHS v8.5 (Apache 2.2) IHS v9.0 (Apache 2.4)
๋ชจ๋“  ์š”์ฒญ ํ—ˆ์šฉ Order allow,deny
Allow from all
Require all granted
๋ชจ๋“  ์š”์ฒญ ๊ฑฐ๋ถ€ Order deny,allow
Deny from all
Require all denied
ํŠน์ • IP ํ—ˆ์šฉ Order deny,allow
Deny from all
Allow from 127.0.0.1
Require ip 127.0.0.1
Warning: IHS 9.0์—์„œ ๊ธฐ์กด 2.2 ๋ฌธ๋ฒ•(Order/Allow)์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด mod_access_compat ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ์‹ ๊ทœ ๋ฌธ๋ฒ•(Require)์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Next Step:
IHS ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๊ณ„ํš์ด๋ผ๋ฉด, ์šด์˜ ์ค‘์ธ httpd.conf ํŒŒ์ผ ๋‚ด์˜ ์ ‘๊ทผ ์ œ์–ด ๊ตฌ๋ฌธ์„ ๋ฏธ๋ฆฌ ์ „์ˆ˜ ์กฐ์‚ฌํ•˜์—ฌ Apache 2.4 ๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[IBM HTTPServer] ๋กœ๊ทธ ๋กœํ…Œ์ด์…˜(Log Rotation) ์„ค์ • (rotatelogs)

IBM HTTPServer(Apache ๊ธฐ๋ฐ˜)์˜ ๋กœ๊ทธ ํŒŒ์ผ์ด ๋‹จ์ผ ํŒŒ์ผ๋กœ ๋ฌดํ•œ์ • ์ปค์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด rotatelogs ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ(Day) ๋‹จ์œ„ ๋“ฑ์œผ๋กœ ๋กœ๊ทธ๋ฅผ ์ž๋™ ๋ถ„ํ• (Rotation)ํ•˜๋Š” ์„ค์ • ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Test Environment

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

1. httpd.conf ์„ค์ • ์ˆ˜์ •

IBM HTTPServer๋Š” Apache ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ๋‚ด์žฅ๋œ rotatelogs ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํŒŒ์ดํ”„(|)๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ๊ฒฝ๋กœ

  • ์œ„์น˜: /IBM/HTTPServer/conf/httpd.conf

์ˆ˜์ • ๋‚ด์šฉ

๊ธฐ์กด ErrorLog์™€ CustomLog ์„ค์ •์„ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์•„๋ž˜์™€ ๊ฐ™์ด ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. 86400์€ ์ดˆ ๋‹จ์œ„(24์‹œ๊ฐ„)๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

# 1. Error Log Rotation ์„ค์ •
# ErrorLog logs/error_log (๊ธฐ์กด ์ฃผ์„ ์ฒ˜๋ฆฌ)
ErrorLog "|/IBM/HTTPServer/bin/rotatelogs /IBM/HTTPServer/logs/error_%Y%m%d.log 86400"

# 2. Access Log Rotation ์„ค์ •
# CustomLog logs/access_log common (๊ธฐ์กด ์ฃผ์„ ์ฒ˜๋ฆฌ)
CustomLog "|/IBM/HTTPServer/bin/rotatelogs /IBM/HTTPServer/logs/access_%Y%m%d.log 86400" common

2. ๋กœ๊ทธ ํฌ๋งท ์ŠคํŠธ๋ง (Format Strings)

๋กœ๊ทธ ํŒŒ์ผ๋ช… ์ƒ์„ฑ ์‹œ ๋‚ ์งœ ํ˜•์‹์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ํฌ๋งท ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

Format Description
%Y 4์ž๋ฆฌ ์—ฐ๋„ (์˜ˆ: 2024)
%y 2์ž๋ฆฌ ์—ฐ๋„ (์˜ˆ: 24)
%m 2์ž๋ฆฌ ์›” (01~12)
%d 2์ž๋ฆฌ ์ผ (01~31)
%H 24์‹œ๊ฐ„์ œ ์‹œ๊ฐ„ (00~23)
%M ๋ถ„ (00~59)
%S ์ดˆ (00~59)
%a / %A ์š”์ผ ์ด๋ฆ„ (๋‹จ์ถ• / ์ „์ฒด)
%b / %B ์›” ์ด๋ฆ„ (๋‹จ์ถ• / ์ „์ฒด)

Next Step:
์„ค์ •์„ ๋ณ€๊ฒฝํ•œ ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ IBM HTTPServer๋ฅผ ์žฌ๊ธฐ๋™(Restart)ํ•ด์•ผ ๋กœ๊ทธ ๋กœํ…Œ์ด์…˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์žฌ๊ธฐ๋™ ํ›„ logs ๋””๋ ‰ํ† ๋ฆฌ์— ๋‚ ์งœ๊ฐ€ ๋ถ™์€ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

[IBM HTTPServer] SSL(HTTPS) ๊ตฌ์„ฑ ๋ฐ ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ ์„ค์ • ๊ฐ€์ด๋“œ

IBM HTTP Server(IHS)์— SSL ์ธ์ฆ์„œ๋ฅผ ์ ์šฉํ•˜์—ฌ HTTPS ํ†ต์‹ ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ , WebSphere Application Server(WAS)์™€ ์ •์ƒ์ ์œผ๋กœ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ์ ˆ์ฐจ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. httpd.conf ์„ค์ •, ํ‚ค ํŒŒ์ผ(KDB) ์ง€์ •, ๊ทธ๋ฆฌ๊ณ  WAS ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ ํฌํŠธ ๋“ฑ๋ก ๊ณผ์ •์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2 (๊ฒฝ๋กœ๋Š” Linux ๊ธฐ์ค€, Windows๋Š” ๋“œ๋ผ์ด๋ธŒ๋ช… ์ฐธ์กฐ)
  • Web Server: IBM HTTP Server v8.5
  • WAS: WebSphere Application Server v8.5

1. ์›น ์„œ๋ฒ„ ์„ค์ • (httpd.conf)

IHS์˜ ๋ฉ”์ธ ์„ค์ • ํŒŒ์ผ์—์„œ SSL ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ณ , 443 ํฌํŠธ์— ๋Œ€ํ•œ VirtualHost๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์ˆ˜์ •

  • ํŒŒ์ผ ์œ„์น˜: [IHS_ROOT]/conf/httpd.conf
  • ์ฃผ์š” ์ž‘์—…: ๋ชจ๋“ˆ ์ฃผ์„ ํ•ด์ œ, ํฌํŠธ ๋ฆฌ์Šจ, ์ธ์ฆ์„œ ํ‚ค ํŒŒ์ผ(KDB) ๊ฒฝ๋กœ ์ง€์ •
### 1. SSL Module Load ###
LoadModule ibm_ssl_module modules/mod_ibm_ssl.so

### 2. Port Listen ###
Listen 0.0.0.0:443

### 3. Virtual Host Configuration ###
# 80 ํฌํŠธ (HTTP) ์„ค์ •
<VirtualHost *:80>
    ServerName ad1.test.com
    DocumentRoot "/opt/IBM/HTTPServer/htdocs"
    # Redirect permanent / https://ad1.test.com/  (ํ•„์š” ์‹œ HTTPS๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ)
</VirtualHost>

# 443 ํฌํŠธ (HTTPS) ์„ค์ •
<VirtualHost *:443>
    SSLEnable
    SSLClientAuth none
    ServerName ad1.test.com
    DocumentRoot "/opt/IBM/HTTPServer/htdocs"
    
    # ๋กœ๊ทธ ์„ค์ • (๊ถŒ์žฅ)
    ErrorLog logs/ssl_error_log
    CustomLog logs/ssl_access_log common
</VirtualHost>

### 4. Global SSL Config ###
# VirtualHost ๋ฐ–์—์„œ ์ „์—ญ ์„ค์ •์œผ๋กœ Keyfile ์ง€์ •
SSLDisable
Keyfile "/opt/IBM/HTTPServer/ssl/key.kdb"

# ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ ์„ค์ • ์˜ˆ์‹œ (TLS 1.2๋งŒ ํ—ˆ์šฉ ์‹œ)
# SSLProtocolDisable SSLv2 SSLv3 TLSv10 TLSv11
# SSLProtocolEnable TLSv12

Note: Keyfile ์ง€์‹œ์–ด๋Š” kdb ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฒฝ๋กœ์— key.sth (Stash file)์ด ํ•จ๊ป˜ ์กด์žฌํ•ด์•ผ ์•”ํ˜ธ๋ฅผ ๋ฌป์ง€ ์•Š๊ณ  ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค.


2. ์ธ์ฆ์„œ ํ‚ค ํŒŒ์ผ (KDB) ์ค€๋น„

IHS๋Š” CMS Key Database (.kdb) ํฌ๋งท์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ikeyman GUI ํˆด์ด๋‚˜ gskcapicmd(CLI)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ธํ‚ค์™€ ์ธ์ฆ์„œ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋„๊ตฌ ์œ„์น˜: [IHS_ROOT]/bin/ikeyman (GUI ์‹คํ–‰ ์‹œ X-Window ํ•„์š”)
  • ์ž‘์—… ๋‚ด์šฉ:
    • ์ƒˆ๋กœ์šด KDB ํŒŒ์ผ ์ƒ์„ฑ (CMS ํƒ€์ž…)
    • ๊ฐœ์ธํ‚ค ์ƒ์„ฑ (CSR) ๋ฐ ๋ฐœ๊ธ‰๋ฐ›์€ ์ธ์ฆ์„œ(Signer, Personal) Import
    • ์ค‘์š”: "Stash password to a file" ์˜ต์…˜์„ ์ฒดํฌํ•˜์—ฌ .sth ํŒŒ์ผ ์ƒ์„ฑ ํ•„์ˆ˜

3. WAS ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ (Virtual Host) ๋“ฑ๋ก

์›น ์„œ๋ฒ„ ์„ค์ •์„ ๋งˆ์ณค๋”๋ผ๋„, WAS์˜ ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ ๋ชฉ๋ก์— SSL ํฌํŠธ(443)๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•˜๊ฑฐ๋‚˜ WAS๊ฐ€ ์š”์ฒญ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ฆฌ ์ฝ˜์†” ์„ค์ •

  1. ์œ„์น˜: ํ™˜๊ฒฝ(Environment) > ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ(Virtual Hosts) > default_host (๋˜๋Š” ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ) > ํ˜ธ์ŠคํŠธ ๋ณ„๋ช…(Host Aliases)
  2. ์ž‘์—…: ์ƒˆ๋กœ ์ž‘์„ฑ(New) ํด๋ฆญ
  3. ์ž…๋ ฅ:
    • ํ˜ธ์ŠคํŠธ ์ด๋ฆ„: * (๋ชจ๋“  ํ˜ธ์ŠคํŠธ) ๋˜๋Š” ad1.test.com
    • ํฌํŠธ: 443
  4. ์ €์žฅ: ๋งˆ์Šคํ„ฐ ๊ตฌ์„ฑ์— ์ €์žฅ ํ›„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋™๊ธฐํ™”.

4. ๊ฒ€์ฆ ๋ฐ ์žฌ๊ธฐ๋™

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

Syntax Check

# IHS bin ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™
./apachectl -t

# ๊ฒฐ๊ณผ๊ฐ€ 'Syntax OK'์—ฌ์•ผ ํ•จ

Server Restart

./apachectl restart

Next Step:
๋ธŒ๋ผ์šฐ์ €์—์„œ https://ad1.test.com์œผ๋กœ ์ ‘์†ํ•˜์—ฌ ์ž๋ฌผ์‡  ์•„์ด์ฝ˜์ด ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , SSL Labs ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ ์šฉ๋œ ์•”ํ˜ธํ™” ํ”„๋กœํ† ์ฝœ(TLS 1.2 ๋“ฑ)์˜ ๋ณด์•ˆ ๋“ฑ๊ธ‰์„ ์ ๊ฒ€ํ•ด๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

[WebSphere] WEB/WAS ์ •์ (Static) ๋ฐ ๋™์ (Dynamic) ์ปจํ…์ธ  ๋ถ„๋ฆฌ ์ฒ˜๋ฆฌ ์ „๋žต

์›น ์‹œ์Šคํ…œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ด๋ฏธ์ง€, CSS, JS ๋“ฑ ์ •์  ๋ฆฌ์†Œ์Šค๋Š” Web Server(IHS)๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ณ , JSP, Servlet ๋“ฑ ๋™์  ๋ฆฌ์†Œ์Šค๋Š” WAS๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. plugin-cfg.xml ์ œ์–ด ๋ฐฉ์‹๊ณผ WAS์˜ fileServingEnabled ์˜ต์…˜ ์‚ฌ์šฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

Test Environment

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

1. ๊ฐœ์š” ๋ฐ ๋ชฉ์ 

๊ธฐ๋ณธ์ ์œผ๋กœ WebSphere ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ชจ๋“  ์š”์ฒญ์„ WAS๋กœ ์ „๋‹ฌํ•˜๋„๋ก ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ •์  ํŒŒ์ผ(*.jpg, *.css ๋“ฑ)๊นŒ์ง€ WAS๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ์˜ ์Šค๋ ˆ๋“œ ์ž์›์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹œ์Šคํ…œ ํšจ์œจ์„ฑ์„ ๋†’์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.


2. Method 1: Plugin-cfg.xml ์ˆ˜๋™ ์ œ์–ด

๊ฐ€์žฅ ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์€ ์›น ์„œ๋ฒ„ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ • ํŒŒ์ผ(plugin-cfg.xml)์—์„œ WAS๋กœ ๋„˜๊ธธ ์š”์ฒญ์˜ ํŒจํ„ด(URI)์„ ๊ฐ•์ œ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์ˆ˜์ •

  • ํŒŒ์ผ ์œ„์น˜: [IHS_ROOT]/Plugins/config/[WebServerName]/plugin-cfg.xml
  • ์ˆ˜์ • ๋‚ด์šฉ: UriGroup ๋‚ด์—์„œ WAS๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ํ™•์žฅ์ž๋งŒ ๋‚จ๊ธฐ๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ฃผ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
<UriGroup Name="default_host_server1_root-PCNode01_Cluster_URIs">
    <!-- WAS๊ฐ€ ์ฒ˜๋ฆฌํ•  ๋™์  ์ปจํ…์ธ ๋งŒ ๋ช…์‹œ -->
    <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="*.jsp"/>
    <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="*.do"/>
    <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/servlet/*"/>
</UriGroup>

์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๋ฉด ๋ช…์‹œ๋˜์ง€ ์•Š์€ ์ด๋ฏธ์ง€๋‚˜ HTML ํŒŒ์ผ ๋“ฑ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํƒ€์ง€ ์•Š๊ณ  ์›น ์„œ๋ฒ„(IHS)๊ฐ€ ์ž์‹ ์˜ DocumentRoot ๋˜๋Š” Alias ๊ฒฝ๋กœ์—์„œ ํŒŒ์ผ์„ ์ฐพ์•„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


3. Method 2: WAS fileServingEnabled ์˜ต์…˜ ์‚ฌ์šฉ

WebSphere ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ์„ค์ •์—์„œ ์ •์  ํŒŒ์ผ ์„œ๋น™ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”(False)ํ•˜์—ฌ, ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒ์„ฑ ์‹œ ์ •์  ํŒŒ์ผ์— ๋Œ€ํ•œ URI ๋งคํ•‘์„ ์ž๋™์œผ๋กœ ์ œ์™ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์œ„์น˜ ๋ฐ ์ˆ˜์ •

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ WEB-INF ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” ํ™•์žฅ ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฒฝ๋กœ ์˜ˆ์‹œ: [Profile_Root]/installedApps/[CellName]/[AppName].ear/[WarName].war/WEB-INF/

1) ibm-web-ext.xmi (๊ตฌ๋ฒ„์ „ ์Šคํƒ€์ผ)

<webappext:WebAppExtension ... fileServingEnabled="false" ...>
</webappext:WebAppExtension>

2) ibm-web-ext.xml (WAS v7.0 ์ด์ƒ ๊ถŒ์žฅ)

<web-ext xmlns="http://websphere.ibm.com/xml/ns/javaee/web-ext/1.0" ...>
    <!-- ์ •์  ํŒŒ์ผ ์„œ๋น™ ๋น„ํ™œ์„ฑํ™” -->
    <enable-file-serving value="false"/>
</web-ext>

์ ์šฉ ์ ˆ์ฐจ

  1. ์„ค์ • ํŒŒ์ผ ์ˆ˜์ • (fileServingEnabled="false")
  2. WAS ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์žฌ์ƒ์„ฑ (Generate Plug-in)
  3. ์žฌ์ƒ์„ฑ๋œ plugin-cfg.xml์„ ์›น ์„œ๋ฒ„๋กœ ์ „ํŒŒ (Propagate)

์ด ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด plugin-cfg.xml ๋‚ด์— ์ •์  ํŒŒ์ผ(*.html, *.jpg ๋“ฑ)์— ๋Œ€ํ•œ URI ์ •์˜๊ฐ€ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.


4. WebServer (IHS) Alias ์„ค์ •

WAS๋กœ ์š”์ฒญ์ด ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š” ์ •์  ํŒŒ์ผ๋“ค์„ ์›น ์„œ๋ฒ„๊ฐ€ ์ฐพ์•„์„œ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฌผ๋ฆฌ์  ๊ฒฝ๋กœ๋ฅผ ๋งคํ•‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

httpd.conf ์„ค์ •

  • ํŒŒ์ผ ์œ„์น˜: [IHS_ROOT]/conf/httpd.conf
  • ์„ค์ • ์˜ˆ์‹œ: URL์˜ /images ์š”์ฒญ์„ ์‹ค์ œ ์„œ๋ฒ„์˜ /home/images ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์—ฐ๊ฒฐ
# ์ •์  ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ ๋งคํ•‘
Alias /images /home/images

<Directory "/home/images">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

5. ์š”์•ฝ ๋ฐ ์ฃผ์˜์‚ฌํ•ญ

  • Full URI ํŒจํ„ด ์ฃผ์˜: plugin-cfg.xml์— Name="*" ์™€ ๊ฐ™์€ ์„ค์ •์ด ์žˆ๋‹ค๋ฉด ๋ชจ๋“  ์š”์ฒญ์ด WAS๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ์›์ธ์ด๋ฏ€๋กœ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋™๊ธฐํ™”: fileServingEnabled ์˜ต์…˜์„ ๋ณ€๊ฒฝํ–ˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์žฌ์ƒ์„ฑ ๋ฐ ์ „ํŒŒํ•˜๊ณ  ์›น ์„œ๋ฒ„๋ฅผ ์žฌ๊ธฐ๋™(Restart) ํ•ด์•ผ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐํฌ ์ „๋žต: ์ •์ /๋™์  ๋ถ„๋ฆฌ ๊ตฌ์„ฑ ์‹œ, ๊ฐœ๋ฐœํŒ€์€ ์ •์  ๋ฆฌ์†Œ์Šค(์ด๋ฏธ์ง€ ๋“ฑ)๋ฅผ WAS ๋ฐฐํฌ ํŒจํ‚ค์ง€(WAR/EAR)์™€ ๋ณ„๋„๋กœ ์›น ์„œ๋ฒ„ ๊ฒฝ๋กœ์— ๋ฐฐํฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜๋ฆฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Next Step:
๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ(F12)์˜ Network ํƒญ์„ ํ†ตํ•ด ์ •์  ํŒŒ์ผ ์š”์ฒญ ์‹œ Response Header์— Server: IBM_HTTP_Server๊ฐ€ ์ฐํžˆ๋Š”์ง€(WAS ์ •๋ณด๊ฐ€ ์•„๋‹Œ์ง€) ํ™•์ธํ•˜์—ฌ ๋ถ„๋ฆฌ ์ฒ˜๋ฆฌ๊ฐ€ ์ •์ƒ์ ์ธ์ง€ ๊ฒ€์ฆํ•ด๋ณด์‹ญ์‹œ์˜ค.

[WebSphere] IHS Plugin Key(kdb) ๋งŒ๋ฃŒ์ผ ํ™•์ธ ๋ฐ ํŒจ์Šค์›Œ๋“œ ๊ฐฑ์‹  (gsk7capicmd)

IBM HTTP Server(IHS) ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์‚ฌ์šฉํ•˜๋Š” ํ‚ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ(plugin-key.kdb)์—๋Š” ๋‚ด๋ถ€ ํŒจ์Šค์›Œ๋“œ ๋งŒ๋ฃŒ์ผ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋งŒ๋ฃŒ ์‹œ ์›น ์„œ๋ฒ„ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด HTTPS ํ†ต์‹ ์„ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ๋ชปํ•ด ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐฑ์‹ ํ•˜๋Š” gsk7capicmd ๋ช…๋ น์–ด ์‚ฌ์šฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. ๋ฌธ์ œ ์ƒํ™ฉ ๋ฐ ์ฆ์ƒ

ํ”Œ๋Ÿฌ๊ทธ์ธ ํ‚ค ํŒŒ์ผ์˜ ํŒจ์Šค์›Œ๋“œ๊ฐ€ ๋งŒ๋ฃŒ๋˜๋ฉด ์›น ์„œ๋ฒ„(IHS) ์žฌ๊ธฐ๋™ ์‹œ ๋˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ์ „ํŒŒ(Propagation) ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ WAS์™€์˜ SSL ํ†ต์‹ ์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

ERROR: lib_security: initializeSecurity: Failed to initialize GSK environment
ERROR: ws_transport: transportInitializeSecurity: Failed to initialize security

2. ๋งŒ๋ฃŒ์ผ ํ™•์ธ (Check Expiry)

gsk7capicmd ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ plugin-key.kdb ํŒŒ์ผ์˜ ํŒจ์Šค์›Œ๋“œ ๋งŒ๋ฃŒ์ผ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ •๋ณด:

  • ๊ธฐ๋ณธ ํŒจ์Šค์›Œ๋“œ: WebAS
  • ๋ช…๋ น์–ด ์œ„์น˜: [IHS_ROOT]/bin ๋˜๋Š” [GSK_ROOT]/bin

Windows ํ™˜๊ฒฝ

C:\IBM\HTTPServer\bin> gsk7capicmd -keydb -expiry -db "C:\IBM\HTTPServer\Plugins\config\webserver1\plugin-key.kdb" -pw WebAS

Validity: Thursday, 26 April 2012 11:20:31 AM Eastern Daylight Time

Unix/Linux/AIX ํ™˜๊ฒฝ

# ๊ฒฝ๋กœ ์ด๋™ (์˜ˆ์‹œ)
cd /usr/bin
# ๋˜๋Š” /usr/opt/ibm/gskta/bin/gsk7capicmd

# ๋งŒ๋ฃŒ์ผ ํ™•์ธ
./gsk7capicmd -keydb -expiry -db "/IBM/Plugins/config/webserver1/plugin-key.kdb" -pw WebAS

Validity: Friday, 27 April 2012 00:20:31 AM KORST

3. ํŒจ์Šค์›Œ๋“œ ๋ณ€๊ฒฝ ๋ฐ ๋งŒ๋ฃŒ์ผ ์—ฐ์žฅ (Change Password)

ํŒจ์Šค์›Œ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•จ๊ณผ ๋™์‹œ์— ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์„ ์—ฐ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋œ ํŒจ์Šค์›Œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ -stash ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅํ•ด์•ผ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ž๋™์œผ๋กœ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ์˜ต์…˜ ์„ค๋ช…

  • -changepw: ํŒจ์Šค์›Œ๋“œ ๋ณ€๊ฒฝ ๋ชจ๋“œ
  • -new_pw: ์ƒˆ๋กœ์šด ํŒจ์Šค์›Œ๋“œ (๊ธฐ์กด ํŒจ์Šค์›Œ๋“œ ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€)
  • -expire: ๋งŒ๋ฃŒ์ผ ์„ค์ • (์ผ ๋‹จ์œ„). 0์œผ๋กœ ์„ค์ • ์‹œ ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์Œ(๊ถŒ์žฅ).
  • -stash: ํŒจ์Šค์›Œ๋“œ๋ฅผ .sth ํŒŒ์ผ์— ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ €์žฅ (ํ•„์ˆ˜)

๋ช…๋ น์–ด ์‹คํ–‰ ์˜ˆ์‹œ

# Windows
gsk7capicmd -keydb -changepw -db "C:\path\to\plugin-key.kdb" -pw WebAS -new_pw WebAS1 -expire 0 -stash

# Unix/Linux/AIX
./gsk7capicmd -keydb -changepw -db "/path/to/plugin-key.kdb" -pw WebAS -new_pw WebAS1 -expire 0 -stash

Note: GSKit 7.0.3.17 ์ด์ „ ๋ฒ„์ „์€ -expire ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


4. ๊ธฐํƒ€ ํ”Œ๋žซํผ๋ณ„ ๋Œ€์‘ (z/OS, IBM i)

z/OS (gskkyman ์‚ฌ์šฉ)

  1. plugin-key.kdb ํŒŒ์ผ ์œ„์น˜๋กœ ์ด๋™ ํ›„ gskkyman ์‹คํ–‰.
  2. ๋ฉ”๋‰ด์—์„œ "3 - Change database password" ์„ ํƒ.
  3. ํ˜„์žฌ ํŒจ์Šค์›Œ๋“œ(WebAS) ๋ฐ ์‹ ๊ทœ ํŒจ์Šค์›Œ๋“œ ์ž…๋ ฅ.
  4. ๋งŒ๋ฃŒ์ผ(Expiration days) ์ž…๋ ฅ ํ”„๋กฌํ”„ํŠธ์—์„œ ์—”ํ„ฐ(Enter)๋ฅผ ๋ˆŒ๋Ÿฌ ๋งŒ๋ฃŒ ์—†์Œ(No expiration) ์„ค์ •.
  5. ๋ณ€๊ฒฝ ํ›„ ๋ฐ˜๋“œ์‹œ Stash ํŒŒ์ผ ๊ฐฑ์‹ : gskkyman -s -k plugin-key.kdb

IBM i (Digital Certificate Manager ์‚ฌ์šฉ)

IBM i ํ™˜๊ฒฝ(V5R4, V6R1, V7R1)์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์˜ DCM ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. HTTP Admin ์„œ๋ฒ„ ์‹œ์ž‘: STRTCPSVR SERVER(*HTTP) HTTPSVR(*ADMIN)
  2. ๋ธŒ๋ผ์šฐ์ € ์ ‘์†: http://[machine]:2001
  3. Digital Certificate Manager > Select a certificate store ์„ ํƒ.
  4. Other System Certificate Store ์„ ํƒ ํ›„ plugin-key.kdb ๊ฒฝ๋กœ ์ž…๋ ฅ.
  5. Reset password ํด๋ฆญ ํ›„ ์‹ ๊ทœ ํŒจ์Šค์›Œ๋“œ ์„ค์ •.
  6. ์˜ต์…˜์—์„œ "Password does not expire" ๋ฐ "Automatic login"(Stash ํšจ๊ณผ) ์ฒดํฌ.

Next Step:
์ž‘์—… ์™„๋ฃŒ ํ›„ ๋ฐ˜๋“œ์‹œ ์›น ์„œ๋ฒ„(IHS)๋ฅผ ์žฌ๊ธฐ๋™ํ•˜์—ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๊ฐฑ์‹ ๋œ plugin-key.kdb ๋ฐ stash ํŒŒ์ผ์„ ์ •์ƒ์ ์œผ๋กœ ๋กœ๋“œํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.