[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) 차단 섀정을 톡해 λΆˆν•„μš”ν•œ μš”μ²­μ„ λ§‰λŠ” μ›Ή μ„œλ²„ κ°•ν™” μž‘μ—…μ„ μ§„ν–‰ν•΄ λ³΄μ‹­μ‹œμ˜€.

[WebSphere] λ³΄μ•ˆ 취약점 쑰치: X-Powered-By 및 Server 헀더 숨기기 μ„€μ •

μ›Ή μ„œλ²„ 응닡 헀더에 ν¬ν•¨λœ X-Powered-By 정보(예: Servlet/3.1)λŠ” λΆˆν•„μš”ν•œ μ„œλ²„ 정보λ₯Ό λ…ΈμΆœν•˜μ—¬ λ³΄μ•ˆ μ·¨μ•½μ μœΌλ‘œ λΆ„λ₯˜λ©λ‹ˆλ‹€. IBM WebSphere Application Server(WAS) v8.5 μ΄μƒμ—μ„œ μ›Ή μ»¨ν…Œμ΄λ„ˆ μ‚¬μš©μž μ •μ˜ 속성을 톡해 이 헀더λ₯Ό μ œκ±°ν•˜λŠ” 방법을 μ •λ¦¬ν•©λ‹ˆλ‹€.

0. λ°°κ²½ 및 원인 (Context)

기본적으둜 WASλŠ” ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 응닡을 보낼 λ•Œ, μžμ‹ μ΄ μ‚¬μš©ν•œ 기술 μŠ€νƒμ„ 헀더에 ν¬ν•¨ν•©λ‹ˆλ‹€.

  • X-Powered-By: κ΅¬ν˜„ 기술 정보 (예: Servlet/3.0, JSP/2.2)
  • Server: μ›Ή μ„œλ²„ μ†Œν”„νŠΈμ›¨μ–΄ 정보 (예: WebSphere Application Server/8.5)

κ³΅κ²©μžλŠ” 이 정보λ₯Ό λ°”νƒ•μœΌλ‘œ νŠΉμ • 버전에 μ‘΄μž¬ν•˜λŠ” μ•Œλ €μ§„ 취약점(CVE)을 곡격할 수 μžˆμœΌλ―€λ‘œ, 운영 ν™˜κ²½μ—μ„œλŠ” λ°˜λ“œμ‹œ μˆ¨κ²¨μ•Ό ν•©λ‹ˆλ‹€.

Test Environment

  • OS: CentOS 7.2
  • WAS: WebSphere Application Server v8.5.5

1. X-Powered-By 헀더 제거 μ„€μ •

WAS 관리 μ½˜μ†”(Admin Console)μ—μ„œ μ›Ή μ»¨ν…Œμ΄λ„ˆ 섀정을 λ³€κ²½ν•©λ‹ˆλ‹€.

μ„€μ • 경둜

μ„œλ²„(Servers) > μ„œλ²„ μœ ν˜•(Server Types) > WebSphere application servers > [μ„œλ²„λͺ…] > μ›Ή μ»¨ν…Œμ΄λ„ˆ μ„€μ •(Web Container Settings) > μ›Ή μ»¨ν…Œμ΄λ„ˆ(Web container) > μ‚¬μš©μž μ •μ˜ νŠΉμ„±(Custom properties)

속성 μΆ”κ°€ (New)

이름 (Name) κ°’ (Value)
com.ibm.ws.webcontainer.disablexPoweredBy true
Tip (Server 헀더도 같이 숨기기):
λ³΄μ•ˆ 강도λ₯Ό 더 높이렀면 com.ibm.ws.webcontainer.disableServerHeader 속성도 true둜 μ„€μ •ν•˜μ—¬ WAS 버전 μ •λ³΄κΉŒμ§€ μˆ¨κΈ°λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.

2. 검증 (Verification)

μ„€μ • μ €μž₯ ν›„ μ„œλ²„λ₯Ό λ°˜λ“œμ‹œ μž¬κΈ°λ™ν•΄μ•Ό μ μš©λ©λ‹ˆλ‹€. curl λͺ…λ Ήμ–΄λ‚˜ λΈŒλΌμš°μ € 개발자 도ꡬ(F12)λ₯Ό 톡해 응닡 헀더λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

λͺ…λ Ήμ–΄ 확인 (Linux)

# -I μ˜΅μ…˜μœΌλ‘œ ν—€λ”λ§Œ 쑰회
curl -I http://localhost:9080/

# 적용 μ „ (λ…ΈμΆœλ¨)
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0
Content-Type: text/html
...

# 적용 ν›„ (사라짐)
HTTP/1.1 200 OK
Content-Type: text/html
...

λΈŒλΌμš°μ € 확인

Chrome 개발자 도ꡬ > Network νƒ­ > 아무 μš”μ²­ 클릭 > Response Headers μ„Ήμ…˜μ—μ„œ ν•΄λ‹Ή ν•­λͺ©μ΄ μ‚¬λΌμ‘ŒλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.


Next Step:
WAS μ„€μ •λΏλ§Œ μ•„λ‹ˆλΌ μ•žλ‹¨μ˜ μ›Ή μ„œλ²„(IHS/Apache)μ—μ„œλ„ ServerTokens Prod 섀정을 톡해 Apache 버전 정보 λ…ΈμΆœμ„ μ΅œμ†Œν™”ν•΄μ•Ό μ™„λ²½ν•œ λ³΄μ•ˆ μ‘°μΉ˜κ°€ λ©λ‹ˆλ‹€.

[Linux/AIX] μœˆλ„μš° 파일 μ—…λ‘œλ“œ μ‹œ λ°œμƒν•˜λŠ” κ°œν–‰ 문자(^M) 제거 방법 (Perl, vi, sed)

Windows(CRLF)μ—μ„œ μž‘μ„±ν•œ νŒŒμΌμ„ Unix/Linux(LF) 계열 μ„œλ²„λ‘œ μ—…λ‘œλ“œν•˜λ©΄, 라인 끝에 ^M νŠΉμˆ˜λ¬Έμžκ°€ λΆ™μ–΄ 슀크립트 μ‹€ν–‰ μ—λŸ¬(bad interpreter)λ₯Ό μœ λ°œν•©λ‹ˆλ‹€. AIX ν™˜κ²½μ—μ„œλ„ ν™•μ‹€ν•˜κ²Œ λ™μž‘ν•˜λŠ” Perl λͺ…λ Ήμ–΄λ₯Ό μ΄μš©ν•œ 일괄 제거 방법을 μ •λ¦¬ν•©λ‹ˆλ‹€.

0. 원인 및 증상 (Context)

μš΄μ˜μ²΄μ œλ§ˆλ‹€ μ€„λ°”κΏˆ(New Line)을 μ²˜λ¦¬ν•˜λŠ” 방식이 λ‹€λ¦…λ‹ˆλ‹€.

  • Windows: CR(Carriage Return, \r) + LF(Line Feed, \n)
  • Unix/Linux/AIX: LF(\n)

FTP 전솑 μ‹œ ASCII λͺ¨λ“œκ°€ μ•„λ‹Œ Binary λͺ¨λ“œλ‘œ μ „μ†‘ν•˜κ±°λ‚˜, λ‹¨μˆœ 볡사/λΆ™μ—¬λ„£κΈ°λ₯Ό ν•  경우 Windows의 CR(\r) λ¬Έμžκ°€ κ·ΈλŒ€λ‘œ 남아 vi μ—λ””ν„°μ—μ„œ ^M으둜 ν‘œμ‹œλ©λ‹ˆλ‹€.

Test Environment

  • OS: AIX (λ˜λŠ” Linux)
  • Shell: sh, ksh, bash

1. 문제 확인 (Issue Identification)

μ‰˜ 슀크립트 μ‹€ν–‰ μ‹œ μ—λŸ¬κ°€ λ°œμƒν•˜κ±°λ‚˜, vi둜 νŒŒμΌμ„ μ—΄μ—ˆμ„ λ•Œ 라인 λλ§ˆλ‹€ ^M이 λΆ™μ–΄μžˆλŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

vi 에디터 ν™”λ©΄

#!/bin/sh^M
#./startServer.sh server_name^M
#./stopServer.sh server_name -username username -password password^M

2. ν•΄κ²° 방법 A: Perl λͺ…λ Ήμ–΄ μ‚¬μš© (ꢌμž₯)

AIX의 κΈ°λ³Έ sed λͺ…λ Ήμ–΄λŠ” -i(파일 직접 μˆ˜μ •) μ˜΅μ…˜μ„ μ§€μ›ν•˜μ§€ μ•ŠλŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ Perl을 μ‚¬μš©ν•˜λŠ” 것이 κ°€μž₯ ν˜Έν™˜μ„±μ΄ μ’‹κ³  κ°„νŽΈν•©λ‹ˆλ‹€.

λͺ…λ Ήμ–΄ ꡬ문

^M을 직접 μž…λ ₯ν•˜κΈ° λ²ˆκ±°λ‘œμš°λ―€λ‘œ, 8μ§„μˆ˜ μ½”λ“œμΈ \015λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ•ˆμ „ν•©λ‹ˆλ‹€.

# ꡬ문: perl -pi -e 's/μ°Ύμ„λ¬Έμž/λ°”κΏ€λ¬Έμž/g' [파일λͺ…]
perl -pi -e 's/\015//g' stopWasAll.sh

닀쀑 파일 일괄 처리

μ™€μΌλ“œμΉ΄λ“œ(*)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ νŒŒμΌμ„ ν•œ λ²ˆμ— λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

# ν˜„μž¬ 경둜의 λͺ¨λ“  .sh νŒŒμΌμ—μ„œ CR 제거
perl -pi -e 's/\015//g' *.sh

3. ν•΄κ²° 방법 B: vi 에디터 λ‚΄λΆ€ μΉ˜ν™˜

νŒŒμΌμ„ 열어놓은 μƒνƒœμ—μ„œ μˆ˜μ •ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

  1. vi둜 파일 μ—΄κΈ°
  2. λͺ…λ Ή λͺ¨λ“œ(ESC)μ—μ„œ μΉ˜ν™˜ λͺ…λ Ήμ–΄ μž…λ ₯
:%s/^M//g
Tip: μœ„ λͺ…λ Ήμ–΄μ˜ ^M은 Shift + 6, M을 νƒ€μ΄ν•‘ν•˜λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€.
λ°˜λ“œμ‹œ Ctrl + Vλ₯Ό λˆ„λ₯Έ μƒνƒœμ—μ„œ Ctrl + M을 λˆŒλŸ¬μ•Ό μž…λ ₯λ©λ‹ˆλ‹€.

4. ν•΄κ²° 방법 C: dos2unix μœ ν‹Έλ¦¬ν‹°

λ¦¬λˆ…μŠ€(CentOS/Ubuntu) ν™˜κ²½μ΄λΌλ©΄ μ „μš© 도ꡬλ₯Ό μ„€μΉ˜ν•˜μ—¬ ν•΄κ²°ν•˜λŠ” 것이 κ°€μž₯ μ‰½μŠ΅λ‹ˆλ‹€.

# μ„€μΉ˜ (CentOS)
yum install -y dos2unix

# λ³€ν™˜
dos2unix stopWasAll.sh

5. 검증 (Verification)

λ³€ν™˜ ν›„ λ‹€μ‹œ vi둜 νŒŒμΌμ„ μ—΄μ–΄ ^M λ¬Έμžκ°€ μ‚¬λΌμ‘ŒλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

test1 root [/was8/bin]# vi stopWasAll.sh

#!/bin/sh
#./startServer.sh server_name
#./stopServer.sh server_name -username username -password password
#PropFilePasswordEncoder.sh
#export LANG=en_us.utf8

κΉ”λ”ν•˜κ²Œ μ •λ¦¬λœ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

[Apache] CentOS 7 μ†ŒμŠ€ 컴파일 μ„€μΉ˜ μ™„λ²½ κ°€μ΄λ“œ: μ˜μ‘΄μ„±(APR, PCRE, OpenSSL) 포함

CentOS 7 ν™˜κ²½μ—μ„œ Apache HTTP Server 2.4λ₯Ό μ†ŒμŠ€ μ½”λ“œλ‘œ μ»΄νŒŒμΌν•˜μ—¬ μ„€μΉ˜ν•˜λŠ” 전체 과정을 λ‹€λ£Ήλ‹ˆλ‹€. APR, APR-Util, PCRE, OpenSSL λ“± ν•„μˆ˜ μ˜μ‘΄μ„± νŒ¨ν‚€μ§€λ₯Ό 별도 경둜(Custom Path)에 μ„€μΉ˜ν•˜κ³  이λ₯Ό Apache와 μ—°λ™ν•˜λŠ” 방법을 μ€‘μ μ μœΌλ‘œ μ„€λͺ…ν•©λ‹ˆλ‹€.

0. 사전 μ€€λΉ„ (Prerequisites)

μ†ŒμŠ€ μ»΄νŒŒμΌμ„ μœ„ν•΄ ν•„μš”ν•œ C μ»΄νŒŒμΌλŸ¬μ™€ κΈ°λ³Έ 라이브러리λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.

OS 및 컴파일 도ꡬ 확인

  • OS: CentOS 7 (Kernel 3.10.0)
  • νŒ¨ν‚€μ§€ μ„€μΉ˜: yum -y install gcc make gcc-c++ pcre-devel expat-devel

1. μ˜μ‘΄μ„± 라이브러리 μ„€μΉ˜ (Dependencies)

Apache 2.4 ꡬ동에 ν•„μš”ν•œ λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ„ /SW/web/tools ν•˜μœ„μ— κ²©λ¦¬ν•˜μ—¬ μ„€μΉ˜ν•©λ‹ˆλ‹€. μ΄λŠ” μ‹œμŠ€ν…œ λΌμ΄λΈŒλŸ¬λ¦¬μ™€μ˜ μΆ©λŒμ„ λ°©μ§€ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

1) APR (Apache Portable Runtime)

OS κ°„μ˜ 차이λ₯Ό 좔상화해 μ£ΌλŠ” 핡심 λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€.

# λ‹€μš΄λ‘œλ“œ 및 μ••μΆ• ν•΄μ œ ν›„ 이동
./configure --prefix=/SW/web/tools/apr
make && make install

2) APR-Util

APR의 μœ ν‹Έλ¦¬ν‹° ν™•μž₯판이며, λ°˜λ“œμ‹œ APR이 λ¨Όμ € μ„€μΉ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

# --with-apr μ˜΅μ…˜μœΌλ‘œ μœ„μ—μ„œ μ„€μΉ˜ν•œ 경둜 μ§€μ • ν•„μˆ˜
./configure --prefix=/SW/web/tools/apr-util --with-apr=/SW/web/tools/apr
make && make install

3) PCRE (Perl Compatible Regular Expressions)

URL μž¬μž‘μ„±(Rewrite) λͺ¨λ“ˆ λ“± μ •κ·œ ν‘œν˜„μ‹ μ²˜λ¦¬μ— μ‚¬μš©λ©λ‹ˆλ‹€.

./configure --prefix=/SW/web/tools/pcre
make && make install

4) OpenSSL (HTTPS 지원)

λ³΄μ•ˆ 톡신(SSL/TLS)을 μœ„ν•΄ OpenSSL μ†ŒμŠ€λ₯Ό μ»΄νŒŒμΌν•©λ‹ˆλ‹€.

# config λͺ…λ Ήμ–΄λ‘œ 경둜 μ„€μ •
./config --prefix=/SW/web/tools/openssl --openssldir=/SW/web/tools/openssl

make && make install

2. Apache (HTTPD) 컴파일 및 μ„€μΉ˜

λͺ¨λ“  μ˜μ‘΄μ„±μ΄ μ€€λΉ„λ˜μ—ˆμœΌλ―€λ‘œ Apacheλ₯Ό μ»΄νŒŒμΌν•©λ‹ˆλ‹€. configure λ‹¨κ³„μ—μ„œ μ•žμ„œ μ„€μΉ˜ν•œ λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ˜ 경둜λ₯Ό μ •ν™•νžˆ μ§€μ •ν•˜λŠ” 것이 ν•΅μ‹¬μž…λ‹ˆλ‹€.

Configure μ‹€ν–‰

tar -zxvf httpd-2.4.41.tar.gz
cd httpd-2.4.41

# μ„€μ • (ν•œ μ€„λ‘œ μž…λ ₯)
./configure \
--prefix=/SW/web/httpd24 \
--enable-so \
--enable-rewrite \
--enable-proxy \
--enable-ssl \
--enable-mods-shared=all \
--enable-modules=shared \
--enable-mpms-shared=all \
--with-mpm=worker \
--with-apr=/SW/web/tools/apr \
--with-apr-util=/SW/web/tools/apr-util \
--with-pcre=/SW/web/tools/pcre \
--with-ssl=/SW/web/tools/openssl \
--enable-unique-id

μ£Όμš” μ˜΅μ…˜ μ„€λͺ…

  • --enable-so: DSO(Dynamic Shared Object) λͺ¨λ“ˆ 적재 κΈ°λŠ₯ ν™œμ„±ν™” (ν•„μˆ˜)
  • --enable-mods-shared=all: λͺ¨λ“  λͺ¨λ“ˆμ„ 동적 λͺ¨λ“ˆλ‘œ 컴파일
  • --with-mpm=worker: λ©€ν‹° ν”„λ‘œμ„ΈμŠ€ λͺ¨λ“ˆ(MPM)을 Worker λ°©μ‹μœΌλ‘œ μ§€μ • (μ„±λŠ₯ 유리)
  • --with-[lib]: μ•žμ„œ μ„€μΉ˜ν•œ μ˜μ‘΄μ„± 라이브러리 경둜 μ—°κ²°

컴파일 및 μ„€μΉ˜

make && make install

3. ꡬ동 및 검증 (Verification)

μ„€μΉ˜κ°€ μ™„λ£Œλ˜λ©΄ μ„œλΉ„μŠ€λ₯Ό κΈ°λ™ν•˜κ³  λΈŒλΌμš°μ € 접속을 ν…ŒμŠ€νŠΈν•©λ‹ˆλ‹€.

μ„œλΉ„μŠ€ 기동

# Apache 컨트둀러 μ‹€ν–‰
/SW/web/httpd24/bin/apachectl start

# ν”„λ‘œμ„ΈμŠ€ 확인
ps -ef | grep httpd
netstat -anotp | grep :80

λ°©ν™”λ²½ μ„€μ • (CentOS 7)

ν”„λ‘œμ„ΈμŠ€κ°€ λ–  μžˆμ–΄λ„ 방화벽이 λ§‰ν˜€μžˆμœΌλ©΄ 접속이 μ•ˆ λ©λ‹ˆλ‹€. 80 포트λ₯Ό μ—΄μ–΄μ€λ‹ˆλ‹€.

firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --reload

접속 확인

λΈŒλΌμš°μ € μ£Όμ†Œμ°½μ— μ„œλ²„ IPλ₯Ό μž…λ ₯ν•˜μ—¬ "It works!" νŽ˜μ΄μ§€κ°€ λœ¨λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

Apache It Works Page

[κ·Έλ¦Ό] μ„€μΉ˜ 성곡 μ‹œ 확인 κ°€λŠ₯ν•œ κΈ°λ³Έ νŽ˜μ΄μ§€


Next Step:
κΈ°λ³Έ μ„€μΉ˜κ°€ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이제 운영 ν™˜κ²½μ— 맞좰 httpd.confμ—μ„œ ServerName κ²½κ³ λ₯Ό ν•΄κ²°ν•˜κ³ , httpd-mpm.confμ—μ„œ Worker ν”„λ‘œμ„ΈμŠ€ νŠœλ‹μ„ μ§„ν–‰ν•΄ λ³΄μ‹­μ‹œμ˜€.

[Linux] find λͺ…λ Ήμ–΄ 싀무 νŒ¨ν„΄ 3κ°€μ§€: 파일λͺ…, μˆ˜μ • μ‹œκ°„, λ¬Έμžμ—΄ 검색(grep) ν™œμš©

λ¦¬λˆ…μŠ€(CentOS 7) ν™˜κ²½μ—μ„œ μ›ν•˜λŠ” νŒŒμΌμ„ λΉ λ₯΄κ³  μ •ν™•ν•˜κ²Œ μ°ΎκΈ° μœ„ν•œ find λͺ…λ Ήμ–΄μ˜ ν•„μˆ˜ μ˜΅μ…˜μ„ μ •λ¦¬ν•©λ‹ˆλ‹€. λŒ€μ†Œλ¬Έμž ꡬ뢄 μ—†λŠ” 검색, 졜근 λ³€κ²½λœ 파일 탐색, 그리고 xargsλ₯Ό μ‘°ν•©ν•œ 파일 λ‚΄μš© 검색 방법을 λ‹€λ£Ήλ‹ˆλ‹€.

Test Environment

  • OS: CentOS 7 (3.10.0-957.el7.x86_64)
  • Shell: Bash

1. 파일λͺ…μœΌλ‘œ 검색 (By Name)

κ°€μž₯ 기본적인 μ‚¬μš©λ²•μž…λ‹ˆλ‹€. -name μ˜΅μ…˜μ€ μ •ν™•ν•œ 이름을, -iname μ˜΅μ…˜μ€ λŒ€μ†Œλ¬Έμžλ₯Ό λ¬΄μ‹œν•˜κ³  κ²€μƒ‰ν•©λ‹ˆλ‹€.

κΈ°λ³Έ 검색

# 전체 경둜(/)μ—μ„œ Mem.sh 파일 μ°ΎκΈ°
find /sw -name "Mem.sh"

# ν˜„μž¬ 디렉토리(.)μ—μ„œ μ°ΎκΈ°
find . -name "Mem.sh"

λŒ€μ†Œλ¬Έμž λ¬΄μ‹œ 검색 (Insensitive)

파일λͺ…μ˜ λŒ€μ†Œλ¬Έμžκ°€ ν™•μ‹€ν•˜μ§€ μ•Šμ„ λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

# Mem.sh, MEM.sh λͺ¨λ‘ 검색됨
find /sw -iname "Mem.sh"
Tip (μ—λŸ¬ 숨기기):
검색 도쀑 Permission denied λ©”μ‹œμ§€κ°€ λ„ˆλ¬΄ 많이 λœ¬λ‹€λ©΄ λͺ…λ Ήμ–΄ 뒀에 2>/dev/null을 λΆ™μ—¬ μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 버릴 수 μžˆμŠ΅λ‹ˆλ‹€.
예: find / -name "test" 2>/dev/null

2. μˆ˜μ • μ‹œκ°„μœΌλ‘œ 검색 (By Time)

μž₯μ•  λ°œμƒ μ‹œμ μ΄λ‚˜ 둜그 뢄석 μ‹œ, νŠΉμ • μ‹œκ°„ 내에 λ³€κ²½λœ νŒŒμΌμ„ 찾을 λ•Œ -mtime(Modification Time) μ˜΅μ…˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

μ‚¬μš© μ˜ˆμ‹œ

# 졜근 1일(24μ‹œκ°„) 이내에 μˆ˜μ •λœ .sh 파일 검색
find /sw -name "*.sh" -mtime -1

μ˜΅μ…˜ 상세 μ„€λͺ…

  • -mtime -n: 졜근 n일 이내에 변경됨 (Today)
  • -mtime +n: n일 이전에 변경됨 (Old files)
  • -mtime n: μ •ν™•νžˆ n일 전에 변경됨

3. 파일 λ‚΄μš© λ¬Έμžμ—΄ 검색 (With Grep)

find둜 찾은 νŒŒμΌλ“€μ˜ λ‚΄μš©(Content)을 κ²€μƒ‰ν•˜κ³  싢을 λ•Œ, νŒŒμ΄ν”„(|)와 xargsλ₯Ό μ‚¬μš©ν•˜μ—¬ grep으둜 λ„˜κ²¨μ€λ‹ˆλ‹€.

검색 νŒŒμ΄ν”„λΌμΈ

[파일 μ°ΎκΈ°][λͺ©λ‘ 전달][λ‚΄μš© 검색]의 νλ¦„μž…λ‹ˆλ‹€.

# 1일 이내 μˆ˜μ •λœ sh νŒŒμΌλ“€ μ€‘μ—μ„œ "Mem"μ΄λΌλŠ” κΈ€μžκ°€ ν¬ν•¨λœ 라인 좜λ ₯
find /sw -name "*.sh" -mtime -1 | xargs grep "Mem"

μ‹€ν–‰ κ²°κ³Ό 해석

/sw/Mem.sh:MEMINFO=`cat /proc/meminfo...`  <-- 파일λͺ…:λ‚΄μš©
/sw/Mem1.sh: TOTAL=`free | grep ^Mem...`
/sw/Mem1.sh: USED=`free | grep ^Mem...`

grep이 findκ°€ μ°Ύμ•„λ‚Έ νŒŒμΌλ“€μ„ ν•˜λ‚˜μ”© μ—΄μ–΄μ„œ "Mem" ν‚€μ›Œλ“œκ°€ μžˆλŠ”μ§€ ν™•μΈν•˜κ³ , ν•΄λ‹Ή 라인을 파일λͺ…κ³Ό ν•¨κ»˜ 좜λ ₯ν•΄ μ€λ‹ˆλ‹€.


Next Step:
νŒŒμΌμ„ λ‹¨μˆœνžˆ μ°ΎλŠ” 것을 λ„˜μ–΄, -exec μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ κ²€μƒ‰λœ 파일의 κΆŒν•œμ„ 일괄 λ³€κ²½(chmod)ν•˜κ±°λ‚˜ μ‚­μ œ(rm)ν•˜λŠ” λ“±μ˜ κ³ κΈ‰ ν™œμš©λ²•μ„ μ΅ν˜€λ³΄μ„Έμš”.

[Linux] 파일/디렉토리 μ†Œμœ κΆŒ(Owner/Group) λ³€κ²½: chown λͺ…λ Ήμ–΄ μ‚¬μš©λ²• 및 μ£Όμ˜μ‚¬ν•­

λ¦¬λˆ…μŠ€ ν™˜κ²½(CentOS 7)μ—μ„œ 파일 및 λ””λ ‰ν† λ¦¬μ˜ μ†Œμœ μž(User)와 κ·Έλ£Ή(Group)을 λ³€κ²½ν•˜λŠ” chown λͺ…λ Ήμ–΄ μ‚¬μš©λ²•μ„ μ •λ¦¬ν•©λ‹ˆλ‹€. ν•˜μœ„ κ²½λ‘œκΉŒμ§€ 일괄 λ³€κ²½ν•˜λŠ” -R μ˜΅μ…˜κ³Ό 싀무 예제λ₯Ό λ‹€λ£Ήλ‹ˆλ‹€.

0. λ°°κ²½ 지식 (Context)

λ¦¬λˆ…μŠ€μ˜ λͺ¨λ“  νŒŒμΌμ€ νŠΉμ • μ‚¬μš©μžμ™€ 그룹에 μ†ν•˜κ²Œ λ©λ‹ˆλ‹€. 보톡 root κΆŒν•œμœΌλ‘œ μ„€μΉ˜ν•˜κ±°λ‚˜ λ³΅μ‚¬ν•œ νŒŒμΌμ€ μ†Œμœ κΆŒμ΄ root둜 λ˜μ–΄ μžˆμ–΄, 일반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 계정(예: wasadm, tomcat λ“±)μ—μ„œ μ ‘κ·Όν•˜κ±°λ‚˜ μ‹€ν–‰ν•  λ•Œ "Permission denied" 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. μ΄λ•Œ chown을 μ‚¬μš©ν•˜μ—¬ μ†Œμœ κΆŒμ„ μ μ ˆν•œ κ³„μ •μœΌλ‘œ λ„˜κ²¨μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

Test Environment

  • OS: CentOS 7 (3.10.0-957.el7.x86_64)
  • User: root (λͺ…λ Ήμ–΄ μ‹€ν–‰ 주체), wasadm (λŒ€μƒ 계정)

1. κΈ°λ³Έ 문법 (Syntax)

chown(Change Owner) λͺ…λ Ήμ–΄μ˜ κΈ°λ³Έ κ΅¬μ‘°μž…λ‹ˆλ‹€. 루트(Superuser) κΆŒν•œμ΄ ν•„μš”ν•©λ‹ˆλ‹€.

# μ†Œμœ μžλ§Œ λ³€κ²½
chown [USER] [FILE]

# μ†Œμœ μžμ™€ κ·Έλ£Ή λ™μ‹œ λ³€κ²½ (κ°€μž₯ 많이 μ‚¬μš©)
chown [USER]:[GROUP] [FILE]

# ν•˜μœ„ λ””λ ‰ν† λ¦¬κΉŒμ§€ μž¬κ·€μ  λ³€κ²½
chown -R [USER]:[GROUP] [DIRECTORY]

2. 싀무 μ‚¬μš© μ˜ˆμ‹œ (Examples)

μ œκ³΅ν•΄μ£Όμ‹  둜그λ₯Ό λ°”νƒ•μœΌλ‘œ 상황별 λͺ…λ Ήμ–΄ μ‚¬μš©λ²•μ„ λΆ„μ„ν•©λ‹ˆλ‹€.

Step 1: 전체 μ΄ˆκΈ°ν™” (root κΆŒν•œμœΌλ‘œ μ„€μ •)

-R μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ ν˜„μž¬ 디렉토리(*)의 λͺ¨λ“  파일과 폴더λ₯Ό root:root μ†Œμœ λ‘œ λ³€κ²½ν•©λ‹ˆλ‹€.

[root@localhost sw]# chown -R root:root *

# 확인
[root@localhost sw]# ls -alrt
drwxrwxrwx.  2 root root   6 Feb  5 01:49 img
drwx------.  2 root root   6 Feb  5 01:49 was
...
주의 (Warning):
chown -R은 맀우 κ°•λ ₯ν•œ λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€. μ‹€μˆ˜λ‘œ 루트 디렉토리(/)λ‚˜ μ‹œμŠ€ν…œ λ””λ ‰ν† λ¦¬μ—μ„œ μ‹€ν–‰ν•  경우 μ‹œμŠ€ν…œ λΆ€νŒ…μ΄ λΆˆκ°€λŠ₯ν•΄μ§ˆ 수 μžˆμœΌλ―€λ‘œ, μ‹€ν–‰ μ „ ν˜„μž¬ 경둜(pwd)λ₯Ό λ°˜λ“œμ‹œ ν™•μΈν•˜μ‹­μ‹œμ˜€.

Step 2: νŠΉμ • μ„œλΉ„μŠ€ κ³„μ •μœΌλ‘œ 이관

WASλ‚˜ μ›Ή μ„œλ²„ μš΄μ˜μ„ μœ„ν•΄ νŠΉμ • 디렉토리(img, was)와 슀크립트(Mem.sh)의 μ†Œμœ κΆŒμ„ wasadm κ³„μ •μœΌλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€.

# 디렉토리 및 파일 μ†Œμœ κΆŒ λ³€κ²½ (wasadm 계정, wasadm κ·Έλ£Ή)
[root@localhost sw]# chown wasadm:wasadm img
[root@localhost sw]# chown wasadm:wasadm was
[root@localhost sw]# chown wasadm:wasadm Mem.sh

Step 3: λ³€κ²½ κ²°κ³Ό 검증 (Verification)

ls -l λͺ…λ Ήμ–΄λ‘œ λ³€κ²½λœ μ†Œμœ κΆŒμ„ ν™•μΈν•©λ‹ˆλ‹€. 3번째 컬럼(Owner)κ³Ό 4번째 컬럼(Group)이 λ³€κ²½λœ 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

[root@localhost sw]# ls -alrt
total 8
# λ³€κ²½λœ ν•­λͺ© (wasadm)
drwxrwxrwx.  2 wasadm wasadm   6 Feb  5 01:49 img
drwx------.  2 wasadm wasadm   6 Feb  5 01:49 was
-rwxr-xr-x.  1 wasadm wasadm 428 Feb  8 01:16 Mem.sh

# λ³€κ²½λ˜μ§€ μ•Šμ€ ν•­λͺ© (root μœ μ§€)
drwx------.  2 root   root     6 Feb  5 01:49 web
drwxr-xr-x.  2 root   root     6 Feb  5 01:49 bin
...

Next Step:
μ†Œμœ κΆŒ 변경이 μ™„λ£Œλ˜μ—ˆλ‹€λ©΄, ν•΄λ‹Ή μ‚¬μš©μžκ°€ νŒŒμΌμ— λŒ€ν•΄ μ–΄λ–€ μž‘μ—…μ„ ν•  수 μžˆλŠ”μ§€ κ²°μ •ν•˜λŠ” κΆŒν•œ(Permission) μ„€μ •(chmod) λ‹¨κ³„λ‘œ λ„˜μ–΄κ°€μ•Ό ν•©λ‹ˆλ‹€.

[Linux] CentOS 7 λ©”λͺ¨λ¦¬ μ‚¬μš©λ₯  뢄석 μ™„λ²½ κ°€μ΄λ“œ: free λͺ…λ Ήμ–΄ 변화와 μ‹€μ§ˆ μ‚¬μš©λŸ‰ 계산

CentOS 7(RHEL 7)λΆ€ν„° free λͺ…λ Ήμ–΄μ˜ 좜λ ₯ ν˜•μ‹μ΄ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 기쑴의 buffers/cache 라인이 사라지고 available 컬럼이 μΆ”κ°€λœ 배경을 μ΄ν•΄ν•˜κ³ , μ •ν™•ν•œ λ©”λͺ¨λ¦¬ μ‚¬μš©λ₯ μ„ κ³„μ‚°ν•˜λŠ” 방법을 μ •λ¦¬ν•©λ‹ˆλ‹€.

0. λ°°κ²½ 지식: CentOS 6 vs 7 차이점

λ¦¬λˆ…μŠ€λŠ” λ‚¨λŠ” λ©”λͺ¨λ¦¬λ₯Ό 적극적으둜 μΊμ‹œ(Cache)둜 μ‚¬μš©ν•˜μ—¬ μ„±λŠ₯을 λ†’μž…λ‹ˆλ‹€. λ”°λΌμ„œ 'Used'κ°€ λ†’λ‹€κ³  ν•΄μ„œ λ°˜λ“œμ‹œ λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•œ 것은 μ•„λ‹™λ‹ˆλ‹€.

  • CentOS 6 μ΄ν•˜: -/+ buffers/cache 행을 톡해 μ‹€μ§ˆ μ‚¬μš©λŸ‰μ„ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.
  • CentOS 7 이상: 컀널이 직접 κ³„μ‚°ν•œ available μ»¬λŸΌμ„ 톡해 "μ¦‰μ‹œ μ‚¬μš© κ°€λŠ₯ν•œ λ©”λͺ¨λ¦¬"λ₯Ό νŒλ‹¨ν•©λ‹ˆλ‹€.

Test Environment

  • OS: CentOS 7 (Kernel 3.10.0-957.el7.x86_64)

1. λ©”λͺ¨λ¦¬ 확인 λͺ…λ Ήμ–΄ (free)

κ°€μž₯ 기본적인 확인 λ°©λ²•μž…λ‹ˆλ‹€. -m μ˜΅μ…˜μ€ Megabyte λ‹¨μœ„λ‘œ 좜λ ₯ν•©λ‹ˆλ‹€.

[root@localhost sw]# free -m
              total        used        free      shared  buff/cache   available
Mem:           7803         892        4686         263        2224        6277
Swap:          8064           0        8064

μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ 및 상세 보기

-w(wide) μ˜΅μ…˜μ„ μ£Όλ©΄ buffer와 cacheλ₯Ό λΆ„λ¦¬ν•΄μ„œ λ³Ό 수 있고, -s(seconds) μ˜΅μ…˜μœΌλ‘œ 반볡 μ‘°νšŒκ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

# 1초 κ°„κ²©μœΌλ‘œ buffer/cacheλ₯Ό λΆ„λ¦¬ν•˜μ—¬ 좜λ ₯
free -mw -s 1

2. λ©”λͺ¨λ¦¬ μ‚¬μš©λ₯  계산 곡식 (Calculation)

λ‹¨μˆœνžˆ used / total둜 κ³„μ‚°ν•˜λ©΄ μΊμ‹œ λ©”λͺ¨λ¦¬κΉŒμ§€ μ‚¬μš©λŸ‰μ— ν¬ν•¨λ˜μ–΄ μˆ˜μΉ˜κ°€ κ³Όλ„ν•˜κ²Œ λ†’κ²Œ λ‚˜μ˜΅λ‹ˆλ‹€. λͺ©μ μ— 따라 계산 방식을 달리해야 ν•©λ‹ˆλ‹€.

곡식 A: OS κ΄€μ μ˜ μ‚¬μš©λ₯  (μΊμ‹œ 포함)

λ©”λͺ¨λ¦¬κ°€ μ‹€μ œλ‘œ μ–Όλ§ˆλ‚˜ ν• λ‹Ήλ˜μ–΄ μžˆλŠ”μ§€(λ°˜λ‚©λ˜μ§€ μ•Šμ€ μƒνƒœ) 확인할 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

$$ Usage(\%) = \frac{used}{total} \times 100 $$

곡식 B: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ΄€μ μ˜ μ‹€μ§ˆ μ‚¬μš©λ₯  (ꢌμž₯)

"μ‹€μ œλ‘œ λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•œκ°€?"λ₯Ό νŒλ‹¨ν•  λ•ŒλŠ” available 값을 κΈ°μ€€μœΌλ‘œ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

$$ Usage(\%) = \frac{total - available}{total} \times 100 $$

Tip: sar -r 1 λͺ…λ Ήμ–΄λ₯Ό ν†΅ν•΄μ„œλ„ %memused(λ©”λͺ¨λ¦¬ μ‚¬μš©λ₯ )λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

3. μ£Όμš” νŒŒλΌλ―Έν„° μ„€λͺ… (Parameters)

CentOS 7 free λͺ…λ Ήμ–΄μ˜ 각 컬럼이 μ˜λ―Έν•˜λŠ” λ°”λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

νŒŒλΌλ―Έν„° μ„€λͺ…
total μ„€μΉ˜λœ 전체 물리 λ©”λͺ¨λ¦¬ 크기
used ν˜„μž¬ ν• λ‹Ήλ˜μ–΄ μ‚¬μš© 쀑인 λ©”λͺ¨λ¦¬ (total - free - buff/cache)
free 아무 μš©λ„λ‘œλ„ μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μ™„μ „ν•œ 유휴 λ©”λͺ¨λ¦¬
shared tmpfs(λž¨λ””μŠ€ν¬) λ“± ν”„λ‘œμ„ΈμŠ€ κ°„ κ³΅μœ λ˜λŠ” λ©”λͺ¨λ¦¬
buff/cache 컀널 버퍼 및 파일 μ‹œμŠ€ν…œ μΊμ‹œ (ν•„μš”μ‹œ μ¦‰μ‹œ λ°˜ν™˜ κ°€λŠ₯)
available (핡심) μŠ€μ™€ν•‘(Swapping) 없이 μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€ 싀행에 μ¦‰μ‹œ ν• λ‹Ή κ°€λŠ₯ν•œ λ©”λͺ¨λ¦¬ μΆ”μ •μΉ˜

Next Step:
λ©”λͺ¨λ¦¬ μ‚¬μš©λ₯ μ΄ λΉ„μ •μƒμ μœΌλ‘œ λ†’λ‹€λ©΄(available λΆ€μ‘±), top λͺ…λ Ήμ–΄λ‘œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Leak)κ°€ μ˜μ‹¬λ˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό μ°Ύκ±°λ‚˜, echo 3 > /proc/sys/vm/drop_caches λͺ…λ Ήμ–΄λ‘œ μΊμ‹œλ₯Ό κ°•μ œ λ°˜ν™˜ν•˜μ—¬ κ°€μš© 곡간을 ν™•λ³΄ν•˜λŠ” 방법을 κ²€ν† ν•΄ λ³΄μ„Έμš”.

[Linux] Java μ‹€μ œ μ„€μΉ˜ 경둜 확인 방법: which vs readlink 차이점 및 JAVA_HOME μ„€μ •

λ¦¬λˆ…μŠ€ ν™˜κ²½μ—μ„œ java λͺ…λ Ήμ–΄μ˜ μ‹€μ œ μ„€μΉ˜ μœ„μΉ˜(Absolute Path)λ₯Ό μ°ΎλŠ” 방법을 μ •λ¦¬ν•©λ‹ˆλ‹€. λ‹¨μˆœ 경둜 ν™•μΈμš©μΈ which와 심볼릭 링크의 원본을 μ°Ύμ•„μ£ΌλŠ” readlink -f의 차이점을 μ΄ν•΄ν•˜κ³ , 이λ₯Ό 톡해 JAVA_HOME을 μ„€μ •ν•˜λŠ” νŒμ„ λ‹€λ£Ήλ‹ˆλ‹€.

0. λ°°κ²½ 지식 (Context)

λ¦¬λˆ…μŠ€(특히 CentOS/RHEL 계열)λŠ” alternatives μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ λ²„μ „μ˜ ν”„λ‘œκ·Έλž¨μ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€. λ•Œλ¬Έμ— /usr/bin/javaλŠ” μ‹€μ œ μ‹€ν–‰ 파일이 μ•„λ‹ˆλΌ, μ—¬λŸ¬ λ‹¨κ³„μ˜ λ°”λ‘œκ°€κΈ°(Symbolic Link)둜 μ—°κ²°λœ 껍데기일 ν™•λ₯ μ΄ λ†’μŠ΅λ‹ˆλ‹€.

Test Environment

  • OS: CentOS 7 (3.10.0-957.el7.x86_64)
  • Package: OpenJDK 1.8

1. λͺ…λ Ήμ–΄ 경둜 확인 (which)

κ°€μž₯ 기본적으둜 μ‚¬μš©ν•˜λŠ” λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€. ν™˜κ²½ λ³€μˆ˜ $PATH에 λ“±λ‘λœ 경둜 쀑 어디에 μžˆλŠ” λͺ…λ Ήμ–΄κ°€ μ‹€ν–‰λ˜λŠ”μ§€ μ•Œλ €μ€λ‹ˆλ‹€.

[wasadm@localhost ~]$ which java
/usr/bin/java
ν•œκ³„μ : μœ„ 결과인 /usr/bin/javaλŠ” μ‹€μ œ 파일이 μ•„λ‹Œ 심볼릭 링크일 κ°€λŠ₯성이 λ†’μ•„μ„œ, 이 경둜λ₯Ό JAVA_HOME으둜 μ„€μ •ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

2. 원본 경둜 좔적 (readlink -f)

심볼릭 링크가 아무리 μ—¬λŸ¬ λ‹¨κ³„λ‘œ κΌ¬μ—¬ μžˆμ–΄λ„, μ΅œμ’… 원본 파일의 μ ˆλŒ€ 경둜λ₯Ό ν•œ λ²ˆμ— μ°Ύμ•„μ£ΌλŠ” κ°€μž₯ ν™•μ‹€ν•œ λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€.

# ꡬ문: readlink -f [심볼릭_링크_경둜]
[wasadm@localhost ~]$ readlink -f /usr/bin/java

# 좜λ ₯ κ²°κ³Ό (μ‹€μ œ μ„€μΉ˜ μœ„μΉ˜)
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64/jre/bin/java

μœ„ κ²°κ³Όμ—μ„œ λ§ˆμ§€λ§‰ /bin/javaλ₯Ό μ œμ™Έν•œ μ•žλΆ€λΆ„μ΄ λ°”λ‘œ JAVA_HOME이 λ©λ‹ˆλ‹€.


3. 링크 ꡬ쑰 단계별 확인 (ls -l)

readlinkκ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ ls -l λͺ…λ Ήμ–΄λ‘œ ν•œ 단계씩 좔적해보면 λ¦¬λˆ…μŠ€μ˜ alternatives ꡬ쑰λ₯Ό 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

Step 1: μ‹€ν–‰ 파일 확인

[wasadm@localhost ~]$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Feb  5 01:36 /usr/bin/java -> /etc/alternatives/java

/usr/bin/javaλŠ” /etc/alternatives/javaλ₯Ό 가리킀고 μžˆμŠ΅λ‹ˆλ‹€.

Step 2: alternatives 확인

[wasadm@localhost ~]$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 71 Feb  5 01:36 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64/jre/bin/java

/etc/alternatives/javaκ°€ λΉ„λ‘œμ†Œ μ‹€μ œ JDKκ°€ μ„€μΉ˜λœ 경둜λ₯Ό 가리킀고 μžˆμŠ΅λ‹ˆλ‹€. readlink -fλŠ” 이 과정을 ν•œ λ²ˆμ— μˆ˜ν–‰ν•΄ μ€λ‹ˆλ‹€.


4. ν™œμš©: JAVA_HOME ν™˜κ²½ λ³€μˆ˜ μ„€μ •

μœ„μ—μ„œ 찾은 경둜λ₯Ό ν™œμš©ν•˜μ—¬ ν™˜κ²½ λ³€μˆ˜λ₯Ό λ“±λ‘ν•©λ‹ˆλ‹€. (/etc/profile λ˜λŠ” ~/.bash_profile)

# 원본 경둜: /usr/lib/jvm/java-1.8.0-.../jre/bin/java
# bin/java μ•žλΆ€λΆ„κΉŒμ§€λ§Œ 볡사

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64/jre
export PATH=$JAVA_HOME/bin:$PATH

Next Step:
λ§Œμ•½ μ„œλ²„μ— μ—¬λŸ¬ λ²„μ „μ˜ Javaκ°€ μ„€μΉ˜λ˜μ–΄ μžˆμ–΄ κΈ°λ³Έ μ‹€ν–‰ 버전을 λ³€κ²½ν•˜κ³  μ‹Άλ‹€λ©΄, alternatives --config java λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°„νŽΈν•˜κ²Œ μŠ€μœ„μΉ­ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

[Linux] 파일/디렉토리 κΆŒν•œ 관리 μ™„λ²½ κ°€μ΄λ“œ: chmod λͺ…령어와 755, 777의 의미

λ¦¬λˆ…μŠ€ ν™˜κ²½(CentOS 7)μ—μ„œ 파일 및 λ””λ ‰ν† λ¦¬μ˜ μ ‘κ·Ό κΆŒν•œμ„ μ œμ–΄ν•˜λŠ” chmod λͺ…λ Ήμ–΄ μ‚¬μš©λ²•μ„ μ •λ¦¬ν•©λ‹ˆλ‹€. 숫자 λͺ¨λ“œ(755, 644)와 λ¬Έμžμ—΄ λͺ¨λ“œ(u+x)의 차이λ₯Ό μ΄ν•΄ν•˜κ³ , -R μ˜΅μ…˜μ„ 톡해 ν•˜μœ„ κ²½λ‘œκΉŒμ§€ 일괄 μ μš©ν•˜λŠ” 싀무 예제λ₯Ό λ‹€λ£Ήλ‹ˆλ‹€.

0. λ°°κ²½ 지식: κΆŒν•œμ˜ ꡬ쑰 (Permission Structure)

λ¦¬λˆ…μŠ€μ˜ 파일 κΆŒν•œμ€ μ†Œμœ μž(User), κ·Έλ£Ή(Group), 기타(Other) μ„Έ κ°€μ§€ λŒ€μƒμ— λŒ€ν•΄ 읽기(r), μ“°κΈ°(w), μ‹€ν–‰(x) κΆŒν•œμ„ λΆ€μ—¬ν•˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.

κΆŒν•œ 확인 (ls -l)

ls -l
# κ²°κ³Ό μ˜ˆμ‹œ: drwxr-xr-x (755)
# d(디렉토리) | rwx(μ†Œμœ μž) | r-x(κ·Έλ£Ή) | r-x(기타)

1. κΆŒν•œ λ³€κ²½ (chmod)

chmod(Change Mode) λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ νŒŒμΌμ΄λ‚˜ λ””λ ‰ν† λ¦¬μ˜ κΆŒν•œμ„ λ³€κ²½ν•©λ‹ˆλ‹€. 이미 μƒμ„±λœ 파일의 ν˜„μž¬ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€.

μ˜΅μ…˜ μ„€λͺ…

  • -R (--recursive): 디렉토리 λ‚΄λΆ€μ˜ λͺ¨λ“  파일과 ν•˜μœ„ λ””λ ‰ν† λ¦¬κΉŒμ§€ μž¬κ·€μ μœΌλ‘œ(일괄) λ³€κ²½ν•©λ‹ˆλ‹€. (κ°€μž₯ 많이 μ‚¬μš©)

싀무 μ‚¬μš© μ˜ˆμ‹œ

# 1. WAS 디렉토리: μ†Œμœ μžλ§Œ λͺ¨λ“  κΆŒν•œ(7), λ‚˜λ¨Έμ§€λŠ” μ ‘κ·Ό λΆˆκ°€(0)
chmod -R 700 ./was

# 2. μ›Ή 루트 및 λ°”μ΄λ„ˆλ¦¬: μ†Œμœ μž(7), κ·Έλ£Ή/κΈ°νƒ€λŠ” 읽기/μ‹€ν–‰λ§Œ(5) - 일반적인 μ„€μ •
chmod -R 755 ./web
chmod -R 755 ./bin

# 3. 이미지 μ—…λ‘œλ“œ 폴더: λˆ„κ΅¬λ‚˜ μ“°κ³  읽기 κ°€λŠ₯ (λ³΄μ•ˆ 주의!)
chmod -R 777 ./img

2. κΆŒν•œ μ„€μ • 방식 A: 숫자 λͺ¨λ“œ (Octal Mode)

κ°€μž₯ 직관적이고 많이 μ‚¬μš©λ˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 각 κΆŒν•œμ— ν• λ‹Ήλœ 점수(4, 2, 1)λ₯Ό λ”ν•΄μ„œ ν‘œν˜„ν•©λ‹ˆλ‹€.

κΆŒν•œ (Permission) 기호 (Symbol) 숫자 κ°’ (Octal)
Read (읽기) r 4
Write (μ“°κΈ°) w 2
Execute (μ‹€ν–‰) x 1

μ‘°ν•© μ˜ˆμ‹œ

  • 7 (rwx): 4 + 2 + 1 (λͺ¨λ“  κΆŒν•œ)
  • 6 (rw-): 4 + 2 (읽기/μ“°κΈ° - 일반 파일)
  • 5 (r-x): 4 + 1 (읽기/μ‹€ν–‰ - μ‹€ν–‰ 파일, 디렉토리)
  • 0 (---): κΆŒν•œ μ—†μŒ

3. κΆŒν•œ μ„€μ • 방식 B: λ¬Έμžμ—΄ λͺ¨λ“œ (Symbolic Mode)

νŠΉμ • λŒ€μƒμ˜ κΆŒν•œλ§Œ 콕 μ§‘μ–΄μ„œ μΆ”κ°€(+)ν•˜κ±°λ‚˜ 제거(-)ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

λŒ€μƒ (Who) μ—°μ‚°μž (Op) κΆŒν•œ (Permission)
u: User (μ†Œμœ μž)
g: Group (κ·Έλ£Ή)
o: Other (기타)
a: All (전체, ugo)
+: μΆ”κ°€
-: 제거
=: μ§€μ •
r: 읽기
w: μ“°κΈ°
x: μ‹€ν–‰

μ‚¬μš© μ˜ˆμ‹œ

# run.sh νŒŒμΌμ— μ‹€ν–‰(x) κΆŒν•œ μΆ”κ°€ (λͺ¨λ“  μ‚¬μš©μžμ—κ²Œ)
chmod +x run.sh

# κ·Έλ£Ή(g)μ—κ²Œ μ“°κΈ°(w) κΆŒν•œ 제거
chmod g-w file.txt

# 기타 μ‚¬μš©μž(o)μ—κ²Œ 읽기(r) κΆŒν•œλ§Œ ν• λ‹Ή
chmod o=r file.txt

Next Step:
파일의 κΆŒν•œλΏλ§Œ μ•„λ‹ˆλΌ μ†Œμœ κΆŒμ„ λ³€κ²½ν•΄μ•Ό ν•  λ•ŒλŠ” chown(Change Owner) λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. chown user:group filename ν˜•μ‹μ„ ν•¨κ»˜ μ΅ν˜€λ‘μ„Έμš”.

[JBoss EAP 7] Datasource νŒ¨μŠ€μ›Œλ“œ μ•”ν˜Έν™” κ°€μ΄λ“œ: Picketbox Security Domain μ„€μ •

λ³΄μ•ˆ μ»΄ν”ŒλΌμ΄μ–ΈμŠ€ μ€€μˆ˜λ₯Ό μœ„ν•΄ JBoss EAP 7의 standalone.xml λ˜λŠ” domain.xml 파일 내에 μ €μž₯λ˜λŠ” DB νŒ¨μŠ€μ›Œλ“œλ₯Ό μ•”ν˜Έν™”ν•˜λŠ” 방법을 μ •λ¦¬ν•©λ‹ˆλ‹€. org.picketbox λͺ¨λ“ˆμ„ μ΄μš©ν•˜μ—¬ μ•”ν˜Έν™”λœ λ¬Έμžμ—΄μ„ μƒμ„±ν•˜κ³ , Security Domain을 톡해 λ°μ΄ν„°μ†ŒμŠ€μ™€ μ—°λ™ν•©λ‹ˆλ‹€.

0. λ°°κ²½ 및 μ€€λΉ„ (Context)

JBoss μ„€μ • νŒŒμΌμ— λΉ„λ°€λ²ˆν˜Έλ₯Ό ν‰λ¬ΈμœΌλ‘œ μ €μž₯ν•˜λ©΄ λ³΄μ•ˆ 감사 μ‹œ 지적 λŒ€μƒμ΄ λ©λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ JBossλŠ” Security Domain을 톡해 인증 과정을 μœ„μž„ν•˜λŠ” 방식을 μ œκ³΅ν•©λ‹ˆλ‹€.

Test Environment

  • OS: CentOS 7.2
  • WAS: JBoss EAP 7.2
  • JDK: 1.8

1. λΉ„λ°€λ²ˆν˜Έ μ•”ν˜Έν™” λ¬Έμžμ—΄ 생성 (Encryption)

κ°€μž₯ λ¨Όμ € μ‹€μ œ DB νŒ¨μŠ€μ›Œλ“œλ₯Ό μ•”ν˜Έν™”λœ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. JBoss λ‚΄λΆ€ λͺ¨λ“ˆμΈ picketboxλ₯Ό Java둜 μ‹€ν–‰ν•˜μ—¬ λ³€ν™˜ν•©λ‹ˆλ‹€.

μ•”ν˜Έν™” 슀크립트 (create_encrypt_pw.sh)

JBoss 패치(CP)κ°€ 적용되면 .overlays 디렉토리에 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ 변경될 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜ μŠ€ν¬λ¦½νŠΈλŠ” 패치 μ—¬λΆ€λ₯Ό μžλ™μœΌλ‘œ κ°μ§€ν•˜μ—¬ μ μ ˆν•œ jar νŒŒμΌμ„ μ°Ύμ•„ μ‹€ν–‰ν•©λ‹ˆλ‹€.

#!/bin/sh

# 1. ν™˜κ²½ λ³€μˆ˜ μ„€μ • (μ‚¬μš©μž ν™˜κ²½μ— 맞게 μˆ˜μ • ν•„μˆ˜)
export JAVA_HOME="/SW/was/java1.8"
export PATH="$JAVA_HOME/bin:$PATH"
JBOSS_HOME="/SW/was/JBoss7.2"

# 2. 라이브러리 경둜 탐색 (Overlay 지원)
OVERLAY_DIRECTORY="$JBOSS_HOME/modules/system/layers/base/.overlays"
SEARCH_DIRECTORY="$JBOSS_HOME/modules/system/layers/base/org/picketbox/main"

if [ -d "$OVERLAY_DIRECTORY" ]; then
    # μ΅œμ‹  패치 디렉토리 확인
    PATCH_SUBDIRECTORY=$(ls -dt $OVERLAY_DIRECTORY/* | grep "CP" | head -n 1)
    if [ -n "$PATCH_SUBDIRECTORY" ]; then
        echo "Info: Patch directory detected: $PATCH_SUBDIRECTORY"
        SEARCH_DIRECTORY="$PATCH_SUBDIRECTORY/org/picketbox/main"
    fi
fi

# 3. Classpath μ„€μ •
export CLASSPATH=$(find "$SEARCH_DIRECTORY" -name "*.jar" -print | tr '\n' ':')$CLASSPATH

# 4. μ•”ν˜Έν™” μ‹€ν–‰
echo ""
read -p "Enter Database Password : " PASSWORD
echo ""
echo "####################################################"
java org.picketbox.datasource.security.SecureIdentityLoginModule "$PASSWORD"
echo "####################################################"
echo ""

μ‹€ν–‰ κ²°κ³Ό μ˜ˆμ‹œ

Encoded password: 9fdd42c2a7390d3

좜λ ₯된 Encoded password 값을 볡사해 λ‘‘λ‹ˆλ‹€.


2. Security Domain μ„€μ • (standalone.xml)

μƒμ„±ν•œ μ•”ν˜Έν™” νŒ¨μŠ€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” λ³΄μ•ˆ 도메인을 μ •μ˜ν•©λ‹ˆλ‹€. security μ„œλΈŒμ‹œμŠ€ν…œ 내에 μž‘μ„±ν•©λ‹ˆλ‹€.

μ„€μ • λ‚΄μš©

<subsystem xmlns="urn:jboss:domain:security:2.0">
    <security-domains>
        
        <security-domain name="encryptedSecurityDB" cache-type="default">
            <authentication>
                <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                    <module-option name="username" value="sa"/>
                    <module-option name="password" value="9fdd42c2a7390d3"/> <!-- μ•”ν˜Έν™”λœ κ°’ -->
                    <module-option name="managedConnectionFactoryName" value="jboss.jca:service=LocalTxCM"/>
                </login-module>
            </authentication>
        </security-domain>
        
    </security-domains>
</subsystem>
μ˜΅μ…˜ μ„€λͺ…:
  • username: DB 접속 계정 ID (평문)
  • password: μœ„μ—μ„œ μƒμ„±ν•œ μ•”ν˜Έν™”λœ νŒ¨μŠ€μ›Œλ“œ
  • managedConnectionFactoryName: jboss.jca:service=LocalTxCM (κ³ μ •κ°’ μ‚¬μš©)

3. Datasource 연동 μ„€μ •

이제 λ°μ΄ν„°μ†ŒμŠ€κ°€ 평문 λΉ„λ°€λ²ˆν˜Έ λŒ€μ‹  μœ„μ—μ„œ λ§Œλ“  Security Domain을 바라보도둝 μˆ˜μ •ν•©λ‹ˆλ‹€.

μˆ˜μ • μ „ (Before)

<datasource ...>
    ...
    <security>
        <user-name>sa</user-name>
        <password>admin1234</password>
    </security>
</datasource>

μˆ˜μ • ν›„ (After)

user-nameκ³Ό password νƒœκ·Έλ₯Ό μ‚­μ œν•˜κ³  security-domain νƒœκ·Έλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
    <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
    <driver>h2</driver>
    
    <security>
        <security-domain>encryptedSecurityDB</security-domain>
    </security>
</datasource>

4. 검증 (Verification)

  1. μ„€μ • μ €μž₯ ν›„ JBoss μ„œλ²„λ₯Ό μž¬κΈ°λ™(Reload)ν•©λ‹ˆλ‹€.
  2. 관리 μ½˜μ†” λ˜λŠ” CLIμ—μ„œ Test Connection을 μˆ˜ν–‰ν•˜μ—¬ μ—°κ²° 성곡 μ—¬λΆ€λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.
  3. μ—°κ²° 성곡 μ‹œ, μ„€μ • νŒŒμΌμ— λΉ„λ°€λ²ˆν˜Έ 평문이 λ‚¨μ•„μžˆμ§€ μ•Šμ€μ§€ μž¬ν™•μΈν•©λ‹ˆλ‹€.

Next Step:
λ§Œμ•½ λΉ„λ°€λ²ˆν˜Έ 뿐만 μ•„λ‹ˆλΌ ν‚€μŠ€ν† μ–΄ νŒ¨μŠ€μ›Œλ“œ λ“± JBoss μ„€μ • μ „λ°˜μ˜ 민감 정보λ₯Ό λ³΄ν˜Έν•΄μ•Ό ν•œλ‹€λ©΄, Vault(볼트) ꡬ성을 μΆ”κ°€λ‘œ κ²€ν† ν•΄ λ³΄μ‹­μ‹œμ˜€.