2023. 2. 23. 21:59ㆍ카테고리 없음
IPMI(Intelligent Platform Management Interface)는 서버의 관리 및 감시를 위한 인터페이스이며, BMC(Baseboard Management Controller)는 서버 관리를 위한 하드웨어 컴포넌트입니다. BMC는 서버의 전원 제어, 센서 읽기, 이벤트 로깅, 원격 재부팅 등 다양한 기능을 수행할 수 있습니다.
아래 명령어를 통해서 전원 정보에 대해서 알수있습니다. 그렇다면 이 명령어는 어떤 과정을 통해서 다른 BMC와 통신을 해서 우리에게 알려주는 것일까요?
ipmitool -I lanplus -C 17 -H 192.168.123.123 -U admin -P admin chassis status
System Power : on
Power Overload : false
Power Interlock : inactive
Main Power Fault : false
Power Control Fault : false
Power Restore Policy : previous
Last Power Event :
Chassis Intrusion : inactive
Front-Panel Lockout : inactive
Drive Fault : false
Cooling/Fan Fault : false
BMC로 패킷을 보내는 과정은 다음과 같습니다.
1. IPMI 도구(ex. ipmitool) 설치 및 구성 먼저, IPMI 도구를 설치해야 합니다. IPMI 도구는 IPMI 명령을 실행할 수 있는 명령줄 인터페이스를 제공합니다. IPMI 도구를 설치하고 구성한 후에는 BMC에 연결할 수 있습니다.
2. BMC 접속 IPMI 도구를 사용하여 BMC에 연결합니다. 이를 위해 BMC IP 주소와 관리자 계정 정보가 필요합니다. 일반적으로 BMC IP 주소는 서버의 로컬 IP 주소와 다릅니다. BMC 관리자 계정 정보는 BMC 제조업체에서 제공하는 기본 값으로 설정할 수도 있습니다.
3. 패킷 보내기 IPMI 도구를 사용하여 BMC로 패킷을 보냅니다. 예를 들어, 센서 값을 읽어오기 위해서는 "ipmitool sensor get" 명령을 사용합니다. 이 명령을 실행하면 BMC는 센서 값을 읽어와 응답 패킷을 반환합니다.
4. 패킷 수신 및 처리
- BMC는 수신한 패킷을 처리하고, 필요에 따라 서버의 하드웨어를 제어하거나 정보를 반환합니다. BMC는 수신한 패킷에 대한 응답 패킷을 생성하여 클라이언트에게 반환합니다.
1,2,3,4 과정을 하기 위해서는
ChannelAuthenticationCapabilities -> OpenSession -> RAKP 이 부분에 대해서 알고있어야한다.
위의 부분들은 1,2,3,4 단계를 진행하기 위해서 IPMI인터페이스를 활용해 BMC로 UDP 기반의 RMCP 패킷을 보내고 응답을 얻어 정보들을 조합한다. 이 조합한 정보를 이용하여 해싱하여 Command를 만들어 보내준다.
ChannelAuthenticationCapabilities
- 통신중인 Target Host의 BMC 칩이 지원하는 IPMI 규약버전정보, 로그인 방식, Authentication Type을 확인, 지원하는 암호화알고리즘 종류
- ChannelAuthenticationCapabilities Request
RmcpHeader:
RmcpSequenceNumber: 255
RmcpMessageClass: IPMI
RmcpMessageRole: REQ
RmcpData: Ipmi15SessionWrapper
IpmiSessionData:
SessionId: 0x0
SessionSequenceNumber: 0x0
IpmiPayload: GetChannelAuthenticationCapabilitiesRequest
IpmiHeader:
IpmiPayloadType: IPMI format=1.0
IpmiCommand: GetChannelAuthenticationCapabilities(App.0x38: Get Channel Authentication Capabilities [Unprotected])
SourceAddress: 0x81
SourceLun: L0
TargetAddress: 0x20
TargetLun: L0
SequenceNumber: 1
ChannelNumber: CURRENT(e)
ExtendedCapabilities: true
ChannelPrivilegeLevel: Administrator
- ChannelAuthenticationCapabilities Response
RmcpHeader:
RmcpSequenceNumber: 255
RmcpMessageClass: IPMI
RmcpMessageRole: REQ
RmcpData: Ipmi15SessionWrapper
IpmiSessionData:
SessionId: 0x0
SessionSequenceNumber: 0x0
IpmiPayload: GetChannelAuthenticationCapabilitiesResponse
IpmiHeader:
IpmiPayloadType: IPMI format=1.0
IpmiCommand: GetChannelAuthenticationCapabilities(App.0x38: Get Channel Authentication Capabilities [Unprotected])
SourceAddress: 0x20
SourceLun: L0
TargetAddress: 0x81
TargetLun: L0
SequenceNumber: 1
IpmiCompletionCode: Normal(0x0): Command Completed Normally.
ChannelNumber: C1(1)
AuthenticationTypes: [MD5, PASSWORD]
LoginStatus: [ANONYMOUS_LOGIN_NONNULL_USERNAMES_ENABLED]
ExtendedCapabilities: [IPMI20_CONNECTIONS_SUPPORTED, IPMI15_CONNECTIONS_SUPPORTED]
OemEnterpriseNumber: 0x0 (0): null
OpenSession
- 서로 다른 bmc간의 session id 교환
- RAKP와 Command 에서 사용될 암호화 알고리즘 전달 (AuthenticationAlgorithm, IntegrityAlgorithm, ConfidentialityAlgorithm )
- SHA1 기반의 방식은 현재 거의 사용하지 않고 있음 (SHA256 기반 추천)
- OpenSession Request
RmcpHeader:
RmcpSequenceNumber: 255
RmcpMessageClass: IPMI
RmcpMessageRole: REQ
RmcpData: Ipmi20SessionWrapper
IpmiSessionData:
SessionId: 0x0
SessionSequenceNumber: 0x0
IpmiPayload: IpmiOpenSessionRequest
IpmiOpenSessionRequest:
MessageTag: 0x2
RequestedMaximumPrivilegeLevel: ADMINISTRATOR
ConsoleSessionId: 0x64
AuthenticationAlgorithm: RAKP_HMAC_SHA1
IntegrityAlgorithm: HMAC_SHA1_96
ConfidentialityAlgorithm: AES_CBC_128
- OpenSession Response
RmcpHeader:
RmcpSequenceNumber: 255
RmcpMessageClass: IPMI
RmcpMessageRole: REQ
RmcpData: Ipmi20SessionWrapper
IpmiSessionData:
SessionId: 0x0
SessionSequenceNumber: 0x0
IpmiPayload: IpmiOpenSessionResponse
IpmiOpenSessionResponse:
MessageTag: 0x2
StatusCode: NO_ERROR
RequestedMaximumPrivilegeLevel: ADMINISTRATOR
ConsoleSessionId: 0x64
SystemSessionId: 0x3002700
AuthenticationAlgorithm: RAKP_HMAC_SHA1
IntegrityAlgorithm: HMAC_SHA1_96
ConfidentialityAlgorithm: AES_CBC_128
RAKP
- RAKP (RMCP+ Authenticated Key-Exchange Protocol )
- RAKP가 뭐하는 단계냐? →
- 랜덤넘버를 교환하고 사용자 이름이랑 요청했던 권한 정보를 해싱해서 password를 키로 이용하여 해싱한값을 이용해서 암호화하여 일회용키인 SIK를 만듦
- HMAC 이라 부름
- 일회용키이면서 재사용은 불가능한 키를 만드는것이 목적
- SIK? → Session Integrity Key로 컨트롤러와 bmc가 각각 생성한 random number, bmc user 정보를 해싱하여 만드는 key
- SIK는 네트워크 통신시 옮겨다닌적이 없음
- 패킷이 탈취당해도 SIK를 알수있는 방법이 없음
- 랜덤넘버를 교환하고 사용자 이름이랑 요청했던 권한 정보를 해싱해서 password를 키로 이용하여 해싱한값을 이용해서 암호화하여 일회용키인 SIK를 만듦
RmcpHeader:
RmcpSequenceNumber: 255
RmcpMessageClass: IPMI
RmcpMessageRole: REQ
RmcpData: Ipmi20SessionWrapper
IpmiSessionData:
SessionId: 0x0
SessionSequenceNumber: 0x0
IpmiPayload: IpmiRAKPMessage1
IpmiRAKPMessage1:
MessageTag: 0x2
SystemSessionId: 0x3002700
ConsoleRandom: (16 bytes) 18 ea 4d 96 98 50 ec 36 db 0f 7a aa 08 fe a4 cc
RequestedMaximumPrivilegeLevel: ADMINISTRATOR
PrivilegeLookupMode: NAME_ONLY
Username: admin
RmcpHeader:
RmcpSequenceNumber: 255
RmcpMessageClass: IPMI
RmcpMessageRole: REQ
RmcpData: Ipmi20SessionWrapper
IpmiSessionData:
SessionId: 0x0
SessionSequenceNumber: 0x0
IpmiPayload: IpmiRAKPMessage2
IpmiRAKPMessage2:
MessageTag: 0x2
ConsoleSessionId: 0x64
SystemRandom: (16 bytes) 81 e7 7d 57 c3 a6 77 e8 41 d4 ca 9c 58 5d fb 3c
SystemGUID: c0ed01ef-9408-d7ba-11e5-2c499e02cd12
KeyExchangeAuthenticationCode: (20 bytes) af 1e 0c 1b d8 b1 a4 87 6f e5 1c 31 a8 44 82 43 b1 39 e3 69
RmcpHeader:
RmcpSequenceNumber: 255
RmcpMessageClass: IPMI
RmcpMessageRole: REQ
RmcpData: Ipmi20SessionWrapper
IpmiSessionData:
SessionId: 0x0
SessionSequenceNumber: 0x0
IpmiPayload: IpmiRAKPMessage3
IpmiRAKPMessage3:
MessageTag: 0x2
StatusCode: NO_ERROR
SystemSessionId: 0x3002700
KeyExchangeAuthenticationCode: (20 bytes) 59 9f 88 24 70 cd a9 d2 b5 bf 34 44 1e a1 c3 81 b6 f3 79 df
RmcpHeader:
RmcpSequenceNumber: 255
RmcpMessageClass: IPMI
RmcpMessageRole: REQ
RmcpData: Ipmi20SessionWrapper
IpmiSessionData:
SessionId: 0x0
SessionSequenceNumber: 0x0
IpmiPayload: IpmiRAKPMessage4
IpmiRAKPMessage4:
MessageTag: 0x2
StatusCode: NO_ERROR
ConsoleSessionId: 0x64
IntegrityCheckValue: (12 bytes) e9 3a 9e 15 1c 56 41 15 cf 63 10 52