ipmitool 명령어를 활용하여 BMC로 패킷 전송 과정 설명

2023. 2. 23. 21:59카테고리 없음

728x90
반응형

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. 패킷 수신 및 처리

  1. 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를 알수있는 방법이 없음
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
728x90
반응형