# RTM CloudHSM HML (vHSM 60042) - endpoint real, caminho de rede e acesso via OpenVPN

Data: 2026-06-21
Ambiente: homologação
Conta AWS: `990933657879`, região `sa-east-1`
Operação: tudo via **AWS SSM** (sem SSH). Bastion/Lerian **somente leitura** (regra absoluta).

## 1. Resumo executivo

- O HSM real da Monetarie HML é **`cloudhsm-hml.priv.rtmcloud.net.br` -> `10.173.1.247`**
  (IP **privado RTM**, alcançável pelo **Direct Connect via TGW da Lerian**). **Não** é o
  `200.160.162.200` público (esse é só o HSM de teste/demonstração na `:63351`).
- Do nosso lado AWS, pelo caminho privado DX, a **`:443` (console web do CloudHSM) ABRE**;
  a **`:60042` (API REST KMIP) está FECHADA** (timeout) para as nossas origens.
- O certificado da Monetarie foi gerado/importado pelo cliente via **console web `:443`**
  (navegador pela VPN), não pela API `:60042`.
- Configuramos a **EC2 `rsfn-egress` (nossa)** como gateway OpenVPN para o HSM: push-route +
  **tradução (NAT) para `192.168.40.10`** + DNS. Acesso à `:443` do HSM pela VPN está pronto.
- **Pendente (lado RTM):** liberar **TCP `:60042` para `192.168.40.10`** para destravar a
  validação programática do cert e da assinatura (e os pods assinarem).

## 2. Credenciais vHSM (NÃO reproduzidas aqui - regra #10)

Arquivo de origem: `/Users/luizpenha/Desktop/HSM - HML.txt`.

- Identificador / **Porta lógica vHSM: `60042`** (é o ID da vHSM, usado no path
  `/v1/kmip/60042/...` - **não** confundir com porta TCP; a API roda na TCP `:60042`).
- Usuário aplicação: `APP-MONETARIE-HML` (gera/importa/assina) - token no arquivo do Desktop.
- VCO admin: `MONETARIE-HML` - token VCO no arquivo do Desktop.

## 3. Topologia de rede do HSM (factual)

```
OpenVPN client / pods --> rsfn-egress 192.168.40.10 --(NAT->192.168.40.10)--> TGW
                                                                               |
                                              tgw-051f1a3c159dfb25b            |
                                       10.173.1.247/32 = static ─> Direct Connect GW
                                                                               |
                                                                          RTM (DX)
                                                                    cloudhsm-hml 10.173.1.247
                                                                    :443 console  | :60042 API KMIP
```

TGW: `tgw-051f1a3c159dfb25b`. Anexos: App VPC `vpc-0db1cc5e57331fe0d`, RTM VPC
`vpc-0d5ecd0df0976bcb9`, **Direct Connect Gateway** `976ff838-a4ae-49a8-bb22-93515b088779`.
Rota TGW (RT default `tgw-rtb-00c87955e8b181f3f`): **`10.173.1.247/32 -> direct-connect-gateway`
(static, active)**. RSFN `200.218.64.0/18` e `200.160.161/163.0/24` propagados pelo DX.

## 4. Diagnóstico - matriz de testes (caminho privado TGW->DX)

| Origem (nossa) | rota p/ 10.173.1.247 | `:443` console | `:60042` API KMIP |
|---|---|---|---|
| egress `192.168.40.10` | TGW->DX (rota adicionada) | **ABRE** | **timeout** |
| bastion `192.168.19.59` | TGW->DX (já existia) | **ABRE** | **timeout** |

- `:443` serve só o **console web** (Kestrel/ASP.NET): `GET /` -> `302` login;
  `POST /v1/kmip/60042/get-session-credential` na `:443` -> `404`. A API KMIP **não** está na `:443`.
- `:60042` (a API KMIP de verdade) dá timeout das duas origens -> **bloqueada no firewall RTM**
  para os nossos IPs. Como a `:443` abre pela mesma origem/rota, **não é roteamento/tradução
  nosso** - é liberação de porta no lado RTM.
- Conclusão aterrada: caminho e tradução corretos; falta a RTM abrir a `:60042`.

### O que NÃO era verdade (corrigido)
- O `200.160.162.200:60042` público **nunca** foi o HSM real - só o de teste responde lá, e
  na `:63351` (vHSM 50154).
- O cliente conecta via **WireGuard no bastion** (peer `herbeth`, endpoint `45.182.105.216`),
  e a partir do túnel acessa o console `:443`. O HSM está na RTM (lado DX), não "no lado do
  cliente". O bastion é só hub WG. **Não alterar o bastion.**

## 5. Route 53 (privado) - já existente

Zona privada **`priv.rtmcloud.net.br`** (`Z01622251A8R9AC0HXS4K`):
- `cloudhsm-hml.priv.rtmcloud.net.br A 10.173.1.247`
- `cloudhsm.priv.rtmcloud.net.br A 10.173.1.247`

## 6. Configuração aplicada na EC2 `rsfn-egress` (nossa - `i-0692fbf5e0dd6d350`)

OpenVPN server: `dev tun0`, clientes `10.250.0.0/22`, DNS `10.250.0.1` (BIND).

1. **Rota L3** (RT `rtb-003e7f7e9a48d7caf`): `10.173.1.247/32 -> tgw-051f1a3c159dfb25b`.
2. **OpenVPN** (`/etc/openvpn/server/rsfn.conf`, backup `.bak.<ts>`):
   - `push "route 10.173.1.247 255.255.255.255"`
   - `push "dhcp-option DOMAIN priv.rtmcloud.net.br"`
3. **iptables** (persistidos via `netfilter-persistent`):
   - `FORWARD -s 10.250.0.0/22 -d 10.173.1.247/32 -j ACCEPT`
   - `FORWARD -s 10.40.0.0/16 -d 10.173.1.247/32 -j ACCEPT`
   - `nat POSTROUTING -s 10.250.0.0/22 -d 10.173.1.247/32 -j MASQUERADE`
   - `nat POSTROUTING -s 10.40.0.0/16  -d 10.173.1.247/32 -j MASQUERADE`
   - (a tradução faz o tráfego sair como `192.168.40.10`, a origem registrada na RTM)
4. **BIND**: `include /etc/bind/named.conf.monetarie-rtmcloud-static` ->
   zonas master `cloudhsm-hml`/`cloudhsm.priv.rtmcloud.net.br A 10.173.1.247`
   (`/etc/bind/monetarie-rtmcloud-static/`).

Verificação na egress: DNS resolve e `nc 10.173.1.247:443 -> succeeded`.

### Como usar
- **Reconectar** o cliente OpenVPN (push-route só chega em conexão nova).
- Acessar `https://cloudhsm-hml.priv.rtmcloud.net.br/` (ou `https://10.173.1.247`) -> console `:443`.

## 7. Política de tráfego (estado desejado)

- `*.priv.rtmcloud.net.br` (HSM `10.173.1.247`) -> traduzido pela **egress** (`192.168.40.10`),
  via TGW->DX.
- `*.rsfn.net.br` -> segue saindo pela **egress** (relay `172.16.70.0/24` + `200.218.64.0/18`),
  como já configurado em `docs/plans/2026-06-21-rsfn-relay-monetarie-isolado-design.md`.

## 8. Pendências

1. **RTM liberar TCP `:60042` (API KMIP) para `192.168.40.10`** - bloqueio atual. Sem isso,
   `get-session`/`sign-rsa`/`locate`/`get-object` não respondem da AWS.
2. Após liberação: validar **certificado** (`get-object`/`get-attributes`, conferir subject
   `MONETARIE`/CNPJ `46026562`, emissor ICP-Brasil) e **assinatura** (`sign-rsa` + `verify`)
   na vHSM 60042, a partir da egress.
3. Rota DICT real (`62188010000150`) com mTLS usando a identidade Monetarie depende dessa
   validação - ver `docs/handoff/2026-06-21-rsfn-relay-dict-mtls-hsm-test.md`.

## 9. Rollback (lado egress, se necessário)

```
# remover acesso HSM via OpenVPN
sudo sed -i '/push "route 10.173.1.247/d;/DOMAIN priv.rtmcloud.net.br/d' /etc/openvpn/server/rsfn.conf
sudo iptables -D FORWARD -s 10.250.0.0/22 -d 10.173.1.247/32 -j ACCEPT
sudo iptables -D FORWARD -s 10.40.0.0/16  -d 10.173.1.247/32 -j ACCEPT
sudo iptables -t nat -D POSTROUTING -s 10.250.0.0/22 -d 10.173.1.247/32 -j MASQUERADE
sudo iptables -t nat -D POSTROUTING -s 10.40.0.0/16  -d 10.173.1.247/32 -j MASQUERADE
sudo netfilter-persistent save
sudo sed -i '\#named.conf.monetarie-rtmcloud-static#d' /etc/bind/named.conf.local
sudo rm -rf /etc/bind/monetarie-rtmcloud-static /etc/bind/named.conf.monetarie-rtmcloud-static
sudo rndc reload && sudo systemctl restart openvpn-server@rsfn
# remover rota L3
aws ec2 delete-route --route-table-id rtb-003e7f7e9a48d7caf --destination-cidr-block 10.173.1.247/32
```

## 10. IDs de referência

| Item | Valor |
|---|---|
| HSM real | `cloudhsm-hml.priv.rtmcloud.net.br` = `10.173.1.247` (vHSM 60042) |
| HSM teste | `200.160.162.200:63351` (vHSM 50154) |
| EC2 egress (nossa) | `i-0692fbf5e0dd6d350` / `192.168.40.10` / RT `rtb-003e7f7e9a48d7caf` |
| Bastion (Lerian, só leitura) | `i-06be52454b879cbbb` / `192.168.19.59` (WireGuard hub) |
| TGW / DXGW | `tgw-051f1a3c159dfb25b` / `976ff838-a4ae-49a8-bb22-93515b088779` |
| Route53 priv | `Z01622251A8R9AC0HXS4K` (`priv.rtmcloud.net.br`) |
