PowerFlex: Configurando o logon único do PowerFlex com o Microsoft Azure usando o OpenID Connect (OIDC)
Resumo: Este artigo orienta você na configuração do PowerFlex Customer Identity and Access Management (CIAM) para SSO com o Microsoft Azure Entra ID usando o OIDC.
Instruções
Este artigo orienta você na configuração do Gerenciamento de acesso e identidade do cliente (CIAM) do PowerFlex para SSO com o Microsoft Azure Entra ID usando OIDC, incluindo configuração de certificado, configuração de IdP e provedor de serviços (SP), troca de tokens e validação de acesso à API. Essa configuração possibilita que você aproveite os recursos de SSO. Ele requer alterações de configuração no PowerFlex e no Microsoft Azure.
Este artigo destina-se a administradores e equipe de segurança que usam o PowerFlex.
O PowerFlex CIAM integra-se a IdPs compatíveis com OIDC, inclusive o Microsoft Azure Entra ID, para permitir a autenticação centralizada e o acesso seguro à API.
Este artigo apresenta um processo passo a passo para configurar o logon único do PowerFlex com o Microsoft Azure por meio da API REST. Esta é a lista de etapas de alto nível:
- Inicializar o CIAM e configurar o PowerFlex como um provedor de serviços (SP) OIDC
- Registrar o Microsoft Azure Entra ID como um provedor de identidade (IdP) do OIDC
- Adicione os certificados CA necessários (DigiCert/GlobalSign) ao CIAM
- Configurar declarações de aplicativos do Microsoft Azure, redirecionar URIs e permissões
- Criar clients OAuth2 do CIAM e mapeamentos de troca de token
- Obtenha um token do Microsoft Azure, troque-o por um token do PowerFlex e valide o acesso à API REST
Terminologia
A tabela a seguir descreve os termos e conceitos importantes necessários para concluir esse processo:
| Termo | Descrição |
| Endereço IP da máquina virtual de gerenciamento (MVM) | Os endereços IP do MVM que hospedam o PowerFlex Manager e os serviços de gerenciamento. Um nó de servidor de dados de armazenamento (SDS) do MVM Você pode encontrar os endereços IP do MVM fazendo login na interface do usuário do PowerFlex Manager. Vá para System-Components>> MVM. Por exemplo, 10.2xx.3xx.184, 10.2xx.3xx.185, 10.2xx.3xx.186 |
| SDS (Storage Data Server, servidor de dados de armazenamento) | O nó do servidor de dados de armazenamento (SDS) que está hospedando os MVMs. |
| Endereço IP de entrada | O IP externo para rke2-ingress-nginx-controller (balanceador de carga/endpoint de entrada) |
| Gerenciamento de acesso e identidade do cliente (CIAM) | Os serviços de gerenciamento de acesso e identidade do cliente do PowerFlex para OAuth2/OIDC |
| Provedor de serviços (SP) | Provedor de identidade (IdP)|O provedor de serviços (PowerFlex/Keycloak) e o provedor de identidade (Microsoft Azure Entra ID) |
Pré-requisitos
Há um script de automação (oidc_azure.tar) usado para conectar o Microsoft Azure Entra ID ao PowerFlex.
O script está em um formato de arquivo tar e deve ser baixado e copiado para seu MVM:
Para copiar o oidc_azure. tar, você deve ter acesso administrativo à máquina virtual de gerenciamento do PowerFlex.
Aqui está o arquivo: oidc_azure.tar
Você deve executar os comandos na captura de tela abaixo, pois as variáveis exportadas são reutilizadas nas etapas e scripts desse processo.
sudo -i

O que cada comando faz?
- O '
kubectl get svc -A | grep "sso " | awk '{print $4}''command retorna o endereço IP do cluster do serviço SSO no cluster do Kubernetes. - O '
curl -k --location --request POST "https://${SSO_IP}:8080/rest/auth/login" --header 'Accept: application/json' --header 'Content-Type: application/json' --data '{"username": "admin","password": "Scaleio123!" }' | jq -r .access_tokenO comando ' faz login no PowerFlex usando a API REST SSO e recupera um token de acesso (JWT) que é usado para chamadas API subsequentes aos serviços do PowerFlex. - O'
kubectl get svc -A | grep -m1 rke2-ingress-nginx-controller | sort | awk '{print $5}''command retorna o endereço IP externo do serviço rke2-ingress-nginx-controller, que normalmente é o IP do balanceador de carga ou do controlador de entrada usado para tráfego externo.
Quando esses comandos são executados, as seguintes variáveis são exportadas:
export SSO_IP=$(kubectl get svc -A | grep "sso " | awk '{print $4}')
export ASMUI_PASS=$(kubectl get secret pfxm-asmui-creds -o json -n powerflex \ | jq '.data | map_values(@base64d)' \ | jq -r '.["keycloak-password"]')
export PM_TOKEN=$(curl -k --location --request POST "https://${SSO_IP}:8080/rest/auth/login" \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --data "{\"username\": \"asmuiuser\",\"password\": \"$ASMUI_PASS\"}" | jq -r .access_token)
export IN_IP=$(kubectl get svc -A | grep -m1 rke2-ingress-nginx-controller | sort | awk '{print $5}')
1. Inicializar o CIAM e configurar o PowerFlex como um provedor de serviços (SP) OIDC
Esta etapa é o ponto inicial do processo de integração do CIAM ao PowerFlex usando o OpenID Connect (OICD). A configuração do CIAM SSO do PowerFlex é inicializada.
API: POST /rest/v1/sso-ciam/init
Comando:
curl -k -X POST https://$IN_IP/rest/v1/sso-ciam/init --header 'Accept: application/json' --header 'Content-Type: application/json' --header "Authorization: Bearer ${PM_TOKEN}"
Script: ./init.sh
Saída: Um inteiro, o ID do grupo de usuários do CIAM, ou seja, "2"
2. Configure o PowerFlex com Keycloak como o provedor de serviços OIDC.
Esta etapa registra e configura o PowerFlex como um provedor de serviços OIDC com Keycloak (ou outro IdP), permitindo a autenticação SSO segura usando o OpenID Connect.
Operação da API: POSTAR /rest/v1/oidc-sp-config
Comando:
curl -kL -X POST --url https://$IN_IP/rest/v1/oidc-sp-config --header 'Content-Type: application/json' --header "Authorization: Bearer ${PM_TOKEN}" --data '{
"sp_id": "powerflex-$IN_IP",
"redirect_uri": "https://$IN_IP/auth/realms/powerflex/protocol/openid-connect/auth",
"logout_uri": "https://$IN_IP/auth/realms/powerflex/protocol/openid-connect/logout",
"required_claims": ["email"],
"keycloak_settings": {
"config": {
"clientAuthMethod": "client_secret_basic",
"pkceEnabled": "true",
"useJwksUrl": "true",
"validateSignature": "true"
},
"first_broker_login_flow_alias": "first broker login",
"post_broker_login_flow_alias": null,
"link_only": null,
"store_token": true,
"add_read_token_role_on_create": true,
"trust_email": true
},
"days_to_store_state_code_verifier": 1}'
Script: ./add_oidc_sp.sh
Resultado (truncado): Novo provedor de serviços
{"id":"00000000-0000-0000-0000-000000000000","sp_id":"powerflex-10.247.39.179","redirect_uris":["https://10.247.39.179/auth/realms/powerflex/protocol/openid-connect/auth"],"logout_uri":"https://10.247.39.179/auth/realms/powerflex/protocol/openid-connect/logout" ... },
2.1 Listar o provedor de serviços OIDC.
Esta etapa recupera a configuração atual do provedor de serviços OIDC do PowerFlex,
Comando:
curl -kL https://$IN_IP/rest/v1/oidc-sp-config --header 'Content-Type: application/json' --header "Authorization: Bearer ${PM_TOKEN}" | jq -r '.results[]'
Script: ./list_oidc_sp.sh
Exemplo de resultado (truncado): Um provedor de serviços criado na etapa anterior.
{"results":[{"id":"00000000-0000-0000-0000-000000000000","sp_id":"powerflex-10.247.39.179",...}]
3. Adicione a autoridade de certificação ao PowerFlex para serviços CIAM.
Esta etapa envolve informar o PowerFlex sobre em qual autoridade de certificação ele deve confiar ao validar a comunicação segura com o sistema CIAM. Há dois certificados para serviços CIAM:
- A DigiCert é uma Autoridade de Certificação (CA) confiável. Os serviços do Microsoft Azure (como Microsoft Azure AD, endpoints OIDC e APIs da Microsoft) usam certificados SSL/TLS emitidos pela DigiCert para proteger a comunicação.
- Os certificados GA2 (GlobalSign ou raiz/intermediário semelhante) fazem parte da cadeia de certificados que valida os pontos de extremidade de identidade do Microsoft Azure. Eles garantem:
- A URL de metadados do OIDC (https://login.microsoftonline.com/...)(Link externo) e os endpoints de token são confiáveis.
- Comunicação HTTPS segura entre o PowerFlex e o IdP do Microsoft Azure.
Essa operação garante que o CIAM confie nos endpoints do Microsoft Azure.
O comando abaixo usa arquivos com certificados codificados por PEM, em que as novas linhas são substituídas por "\n". Basicamente, há apenas uma linha nesse arquivo.
Por exemplo:
-----BEGIN CERTIFICATE-----
\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\nQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\nCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\nnh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\nT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\ngdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\nBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\nTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\nDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\nhMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\nPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\nYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-
----END CERTIFICATE-----
API: Certificados POST /api/v1/CIAM/<ciam_id>/x509
Comando:
CA=`cat $1`
curl -kvvL -X POST https://$IN_IP//Api/V1/CIAM/<return_value_from_init_ciam>/x509-certificates --header "Authorization: Bearer ${PM_TOKEN}" --data-raw "
{
\"type\": \"CA\",
\"service\": \"ALL\",
\"certificate_format\": \"PEM\",
\"certificate\": \"$CA\"
}"
Script: ./add_cert.sh <certificate_pem_file>
Exemplo de resultado (truncado):
cat digicert_ca.pem
-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\nMQs;wCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\nQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\nCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\nnh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\nT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\ngdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\nBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\nTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\nDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\nhMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\nPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\nYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4p
...
Fsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-----END CERTIFICATE-----\n
delladmin@lglou184:~/oidc_testing> cat digicert_g2.pem
-----BEGIN CERTIFICATE-----\nMIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\nMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI\n2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx\n1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ\nq2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz\ntCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ\nvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP\nBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV\n5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY\n1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4\nNeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG\nFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91\n8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe\npLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\nMrY=\n-----END CERTIFICATE-----\n
--------------------------------------------------------------------------------------------------------------------------
./add_cert.sh digicert_ca.pem
{"id":"b5c3d51a-9161-4515-a741-4a197a348cf9","certificate":"-----BEGIN CERTIFICATE-----...\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\nQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\nCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\nnh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\nT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\ngdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\nBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\nTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\nDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\nhMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\nPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\nYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-----END CERTIFICATE-----\n","subject":"C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root CA","common_name":"DigiCert Global Root CA","issuer":"C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root CA","organization":"DigiCert Inc","organizational_unit":"www.digicert.com","country":"US","valid_from_timestamp":"2006-11-10T00:00:00Z","valid_to_timestamp":"2031-11-10T00:00:00Z","key_usage":"Digital Signature, Cert Sign, CRL Sign","type":"CA","service":"ALL","is_self_signed":true,"is_current":true,"is_valid":true,"cert_fingerprint":"43:48:A0:E9:44:4C:78:CB:26:5E:05:8D:5E:89:44:B4:D8:4F:96:62:BD:26:DB:25:7F:89:34:A4:43:C7:* Connection #0 to host 10.247.39.179 left intact
01:61","version":3,"serial_number":10944719598952040374951832963794454346,"signature_algorithm":"RSA","signature_hash_algorithm":"SHA-1","public_key":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKP\nC3eQyaKl7hLOllsBCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtx\nRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmF\naG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvU\nX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrT\nC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOv\nJwIDAQAB\n-----END PUBLIC KEY-----\n"}
3.1 Verifique se os certificados foram adicionados e listados.
Esta etapa verifica se os certificados estão adicionados e listados.
Comando:
curl -kL https://$IN_IP/Api/V1/CIAM/2/x509-certificates --header 'Content-Type: application/json' --header "Authorization: Bearer ${PM_TOKEN}"
Nota: https://$IN_IP//Api/V1/CIAM/2/x509-certificate — aqui está o número 2 do init.sh na etapa 1.
Script: ./list_certs.sh
Exemplo de resultado (truncado):
{"results":[{"id":"4a4d7f6b-251c-41a6-b304-783ed6d5fbc2","certificate":"-----BEGIN ....-----END PUBLIC KEY-----\n"}]}
4. Registrar o ID do Microsoft Azure Entra como o serviço OIDC (IdP)
Esta etapa registra o Microsoft Azure Entra ID como um provedor de identidade externo para o PowerFlex usando o OpenID Connect (OIDC), permitindo que os usuários se autentiquem pelo Microsoft Azure em vez de depender das credenciais locais do PowerFlex.
Variáveis:
- ID do grupo de usuários: O ID do locatário identifica o locatário do Active Directory do Microsoft Azure ao qual o provedor de identidade pertence. Você pode encontrá-lo na página Visão geral da tela inicial do aplicativo no Microsoft Azure.
- KK_ID: A ID do KK identifica a ID do client do aplicativo Microsoft Azure.
- KK_SECRET: O segredo KK identifica o segredo do cliente do Microsoft Azure.
API: POST /rest/v1/oidc-services
curl -kvvL --request POST \
--url "https://$IN_IP/rest/v1/oidc-services" \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer ${PM_TOKEN}" \
--data "{
\"name\": \"azure\",
\"is_enabled\": true,
\"idp_metadata_url\": \"https://login.microsoftonline.com/<Tenant_id>/v2.0/.well-known/openid-configuration\",
\"claims_mapper\": [
{ \"name\": \"email\", \"value\": \"email\" },
{ \"name\": \"given_name\", \"value\": \"firstName\" },
{ \"name\": \"preferred_username\", \"value\": \"username\" },
{ \"name\": \"family_name\", \"value\": \"lastName\" }
],
\"client_id\": \"$KK_ID\",
\"client_secret\": \"$KK_SECRET\",
\"scopes\": [\"openid\",\"profile\",\"email\",\"offline_access\"],
\"pkce_enabled\": true,
\"code_challenge_method\": \"S256\",
\"idp \"idp_type\": \"AzureEntraID\"KK_ID=b151947c-b514-4997-a369-a9b76f26b050
KK_SECRET=tk_8Q~QYTj1FQYN2chWovu.M5Ph3YnIVzLwRJcoZ
TENANT_ID=945c199a-83a2-4e80-9f8c-5a91be5752dd
curl -kL -X POST --url https://$IN_IP/rest/v1/oidc-services --header 'Content-Type: application/json' --header "Authorization: Bearer ${PM_TOKEN}" \
--data \
"{ \"name\": \"azure\", \"is_enabled\": true, \"idp_metadata_url\": \"https://login.microsoftonline.com/${TENANT_ID}/v2.0/.well-known/openid-configuration\",
\"claims_mapper\": [ { \"name\": \"email\", \"value\": \"email\"
},
{
\"name\": \"given_name\",
\"value\": \"firstName\"
},
{
\"name\": \"preferred_username\",
\"value\": \"username\"
},
{
\"name\": \"family_name\",
\"value\": \"lastName\"
}
],
\"client_id\": \"$KK_ID\",
\"client_secret\": \"$KK_SECRET\",
\"scopes\": [
\"openid\",
\"profile\",
\"email\",
\"offline_access\"
],
\"pkce_enabled\": true,
\"code_challenge_method\": \"S256\",
\"idp_type\": \"AzureEntraID\"
}"
Script: ./add_oidc_service.sh
Exemplo de resultado (truncado):
{
"id": "a230b7b8-8f6c-47db-9327-2e48db8040a9",
"name": "azure",
"is_enabled": true,
"idp_metadata_url": "https://login.microsoftonline.com/945c199a-83a2-4e80-9f8c-5a91be5752dd/v2.0/.well-known/openid-configuration",
"idp_metadata_load_timestamp": "2025-11-14T16:00:40.356569216Z",
"idp_metadata": {
"issuer": "https://login.microsoftonline.com/945c199a-83a2-4e80-9f8c-5a91be5752dd/v2.0",
"...": "additional metadata fields"
},
"code_challenge_method": "S256",
"idp_type": "AzureEntraID",
"is_default": false
}
4.1 Listar o serviço OIDC.
Esta etapa lista o serviço OIDC.
Comando:
curl -kL https://$IN_IP/rest/v1/oidc-services --header 'Content-Type: application/json' --header "Authorization: Bearer ${PM_TOKEN}"
Roteiro: list_oidc_service.sh
Exemplo (truncado):
./list_oidc_service.sh
{"results":[{"id":"a230b7b8-8f6c-47db-9327-2e48db8040a9","name":"azure","is_enabled":true,"idp_metadata_url":"https://login.microsoftonline.com/945c199a-83a2-4e80-9f8c-5a91be5752dd/v2.0/.well-known/openid-configuration",..."idp_type":"AzureEntraID","is_default":false}]}
5. Configure a URL de redirecionamento no Microsoft Azure.
Esta etapa envolve a configuração do Microsoft Azure para enviar usuários a um destino chamado URL de redirecionamento depois que eles entrarem com sucesso.
No Portal do Microsoft Azure, vá para Registro de Aplicativo → URIs de Autenticação → Redirecionamento e adicione a seguinte URL:
https:// PFMP_IP<>/auth/realms/powerflex/broker/<SERVICE_ID_AZURE>/endpoint
Por exemplo: https://10.247.39.179/auth/realms/powerflex/broker/a230b7b8-8f6c-47db-9327-2e48db8040a9/endpoint
- <> PFMP_IP é o IP do PowerFlex Manager (se necessário, resolva o nome do host)
- <> SERVICE_ID_AZURE é o IdP do ID de serviço da Etapa 4.
6. Configure as declarações de token no Microsoft Azure.
a) Adicione declarações opcionais (ID Token)
- No Portal do Microsoft Azure, vá para Configuração de token → Adicionar declaração opcional.
- Em Tipo de token, selecione ID.
- Em Declaração, marque a caixa de seleção ao lado dos seguintes atributos:
-
Email
-
family_name
-
given_name
-
preferred_username
-
- Clique em Adicionar.
b) Adicionar reivindicações de grupo
- No Portal do Microsoft Azure, vá para Configuração de token → Adicionar declarações de grupo.
- Em Editar declaração de grupos, marque a caixa de seleção ao lado de Grupos atribuídos ao aplicativo.
- Em ID, marque a caixa de seleção ao lado de Group ID.
- Em Acesso, marque a caixa de seleção ao lado de ID do grupo.
- Clique em Adicionar.
Você usará esses IDs de grupo posteriormente para o mapeamento de funções do PowerFlex na interface do usuário do PowerFlex Manager.
7. Configure permissões de API no Microsoft Azure.
Essa etapa garante que o PowerFlex tenha o acesso correto aos recursos protegidos no Microsoft Azure.
- No Portal do Microsoft Azure, vá para Permissões de API →Microsoft Graph.
- Em Request API permissions, selecione
- Em Request API permissions, selecione User → Read.
- Clique em Update permissions.
8. (Opcional) Atribuir usuários/grupos no Microsoft Azure.
Esta etapa concede aos indivíduos ou equipes apropriados acesso ao PowerFlex atribuindo-os a funções ou grupos específicos no Microsoft Azure Active Directory.
- No Portal do Microsoft Azure, vá para Aplicativos corporativos → Usuários e grupos.
- Em Nome para exibição, marque a caixa de seleção ao lado do usuário/grupo e copie o ID do objeto.
O ID do objeto é usado para o mapeamento de função baseado em declarações no PowerFlex.
9. (Opcional) Adicionar o usuário/grupo na interface do usuário do PowerFlex
Essa etapa envolve conceder acesso no PowerFlex adicionando o usuário ou grupo apropriado diretamente no usuário do PowerFlex Manager, garantindo que eles possam fazer log-in e usar o sistema de acordo com suas funções e permissões atribuídas.
- Faça log-in na interface do usuário do PowerFlex Manager.
- Vá para Configurações → Gerenciamento de usuários → Adicionar usuário/grupo remoto.
- Digite as seguintes informações:
- Tipo: grupo
- Fornecedor: Azure
- Nome do grupo: qualquer nome significativo
- Nome da declaração: grupos
- Função do usuário: Superusuário
- Valor da reivindicação: ID de objeto do Microsoft Azure (etapa 8)
10. Adicione o client ao CIAM.
Esta etapa adiciona o client ao CIAM para registrar o PowerFlex de modo que o CIAM possa determinar qual aplicativo está solicitando autenticação, para onde enviar tokens, quais permissões o aplicativo precisa e quais fluxos de autenticação ele pode usar.
API: Clients POST /rest/v1/oauth2
Comando:
curl -kL --request POST \
--url "https://$IN_IP/rest/v1/oauth2-clients" \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer ${PM_TOKEN}" \
--data "{
\"client_name\": \"azure_oidc_client\",
\"redirect_uris\": [\"\"],
\"authorization_code_flow\": false,
\"client_credentials_flow\": false,
\"token_exchange_enabled\": true,
\"offline_access_enabled\": true,
\"client_offline_session_idle\": 1,
\"client_offline_session_max\": 1,
\"client_security_level\": \"TRUSTED\"
Script: ./addclient_ciam.sh
Exemplo de resultado:
./addclient_ciam.sh
{"id":"77ce10cb-c40e-4c1e-b922-07014b5b6e7b","client_name":"azure_oidc_client","client_secret":"QXDtyVYO5l3Puj2ZMACz/MK+sTSOqDHy53oRhVkXiBc=","redirect_uris":[""],"authorization_code_flow":false,"client_credentials_flow":false,"signing_algorithm":"RS256","refresh_token_max_reuse":3,"access_token_expiration_duration":360,"token_exchange_enabled":true,"client_security_level":"TRUSTED","offline_access_enabled":true,"client_offline_session_idle":1,"client_offline_session_max":1
10.1 Verifique se o client foi adicionado listando-o.
Esta etapa verifica se o client foi adicionado com sucesso, listando todos os clients existentes.
Comando:
curl -kL https://$IN_IP/rest/v1/oauth2-clients --header 'Content-Type: application/json' --header "Authorization: Bearer ${PM_TOKEN}" | jq -r '.results[]'
Script: ./list_clients_ciam.sh
Exemplo:
./list_clients_ciam.sh
{
"id": "77ce10cb-c40e-4c1e-b922-07014b5b6e7b",
"client_name": "azure_oidc_client",
"redirect_uris": [
""
],
"authorization_code_flow": false,
"client_credentials_flow": false,
"signing_algorithm": "RS256",
"refresh_token_max_reuse": 3,
"access_token_expiration_duration": 360,
"token_exchange_enabled": true,
"client_security_level": "TRUSTED",
"offline_access_enabled": true,
"client_offline_session_idle": 1,
"client_offline_session_max": 1,
"num_failed_login_attempts": 0
}
10.2 Modifique o client.
Esta etapa atualiza um client de login existente no CIAM. A payload deve permanecer vazia ({}). Esse comando adiciona os mapeamentos necessários do PowerFlex ao cliente Keycloak.
Comando:
curl -k -X PATCH "https://$IN_IP/rest/v1/login-clients/$1" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ${PM_TOKEN}" \
--data '{}'
Script: ./update_client.sh <ID_FROM_ADD_CLIENT_CIAM>
Exemplo:
./update_client.sh 77ce10cb-c40e-4c1e-b922-07014b5b6e7b
{"id":"1c3dbd45-66bc-44c7-94ce-1aef3a282afc","name":"azure_oidc_client","client_id":"77ce10cb-c40e-4c1e-b922-07014b5b6e7b","is_enabled":true,"client_secret":null,"redirect_uris":[""],"web_origins":[""]}
11. Adicionar o aplicativo ao CIAM para mapeamento de troca de token
Esta etapa adiciona o aplicativo ao CIAM para habilitar a autenticação externa, a autorização e os fluxos de identidade seguros.
API: POST /rest/v1/oauth2-token-exchanges
Variáveis obrigatórias:
- LOCAL_CLIENT_ID: ID de addclient_ciam.sh (por exemplo, 77ce10cb-c40e-4c1e-b922-07014b5b6e7b)
- EXT_CLIENT_ID: ID do aplicativo Microsoft Entra ID (client) (por exemplo, 859c0721-cb0c-433c-a437-bd2d2462754f)
- METADADOS: URL de metadados do aplicativo Microsoft Azure (por exemplo, https://login.microsoftonline.com/< Tenant_id>/v2.0/.well-known/openid-configuration)
- IDP: ID do serviço OIDC (por exemplo, a230b7b8-8f6c-47db-9327-2e48db8040a9)
- PAPEL: Função do PowerFlex (por exemplo, superusuário)
- PM_TOKEN: Token do portador da API
- IN_IP: Endereço IP/host de destino
Comando:
curl -kL -X POST "https://$IN_IP/rest/v1/oauth2-token-exchanges" \
-H "Content-Type: application/json" \
-H "clientId: $LOCAL_CLIENT_ID" \
-H "Authorization: Bearer ${PM_TOKEN}" \
--data @- <<EOF
{
"ciam_oauth2_client_id": "$LOCAL_CLIENT_ID",
"customer_client_id": "$EXT_CLIENT_ID",
"customer_metadata_url": "$METADATA",
"idp_service_id": "$IDP",
"static_roles": ["$ROLE"]
}
Script: ./add_app.sh
11.1 Liste o ID do aplicativo
Esta etapa recupera o ID do aplicativo para validar o identificador exclusivo de client necessário para autorização downstream e operações de troca de tokens.
Comando:
curl -kL "https://$IN_IP/rest/v1/oidc-services" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ${PM_TOKEN}"
Script:
./list_apps.sh
Exemplo:
./list_apps.sh
{ "id": "f803da04-2979-49dc-9408-496f127639b4",
"ciam_oauth2_client_id": "77ce10cb-c40e-4c1e-b922-07014b5b6e7b",
"customer_client_id": "859c0721-cb0c-433c-a437-bd2d2462754f",
"customer_metadata_url": "https://login.microsoftonline.com/945c199a-83a2-4e80-9f8c-5a91be5752dd/v2.0/.well-known/openid-configuration",
"idp_service_id": "a230b7b8-8f6c-47db-9327-2e48db8040a9",
"static_roles": [
"SuperUser" ]
}
12. Mapear funções no Keycloak (realm do PowerFlex)
Esta etapa mapeia funções no realm do PowerFlex Keycloak para alinhar as atribuições de função do provedor de identidade com os requisitos de autorização do PowerFlex.
1. Faça log-in no Keycloak usando o seguinte endpoint: https://< PFMP_IP>/auth/admin/
Por exemplo: https://10.247.39.179/auth/admin/
Para fazer login no Keycloak, as credenciais podem ser recuperadas conforme abaixo
Comando:
kubectl get secret keycloak-admin-credentials -o json -n powerflex | jq '.data | map_values(@base64d)'
Script: ./get_keycloak_creds.sh
Exemplo:
./get_keycloak_creds.sh
{
"password": "sZFmHmfhjj",
"username": "keycloak"
}
2. Na instância Keycloak, selecione PowerFlex.
3. Clique em Usuários e selecione o ID do usuário e atualize os atributos para corresponder à função usada no CIAM (por exemplo, Superusuário).
4. Em Role mapping, verifique se a função está atualizada.
13. Obtenha o token do Microsoft Azure (Senha do proprietário do recurso Credenciais/nome de usuário + senha)
Há várias maneiras de obter um token do Microsoft Azure AD. Neste exemplo de etapa, o aplicativo está fazendo login no Microsoft Entra ID (Azure AD) enviando diretamente o nome de usuário + senha de um usuário ao ponto de extremidade do token para receber um token OAuth 2.0. Essa é a concessão de Credenciais de Senha do Proprietário do Recurso (ROPC).
Comando:
curl -X POST https://login.microsoftonline.com/$TENANT_ID/oauth2/token -H 'Content-Type: application/x-www-form-urlencoded' -d "grant_type=password&client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET&username=$USERNAME&password=$encoded_password&resource=$RESOURCE")
Script:./get_azure_token.sh
Dica: Para garantir que o token seja válido, vá para o Depurador JSON Web Token (JWT) (Link externo)
14. Troque o token do Microsoft Azure pelo token do PowerFlex (CIAM)
Esta etapa troca o token do Microsoft Azure por um token CIAM do PowerFlex para que as APIs do PowerFlex possam ser chamadas.
API: POST /rest/v1/token
Variáveis:
- CIAM_CLIENT_ID - ID do client da etapa Adicionar o client ao CIAM (etapa 10)
- CIAM_CLIENT_SECRET – Segredo do client da etapa Adicionar o client ao CIAM (etapa 10)
- EXT_TOKEN – Token do Microsoft Azure
Comando:
curl -kL -X POST https://$IN_IP/rest/v1/token \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header "ClientId: $CIAM_CLIENT_ID" \
--header "ClientSecret: $CIAM_CLIENT_SECRET" \
--data "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
--data "subject_token=${EXT_TOKEN}" \
--data "subject_token_type=urn:ietf:params:oauth:token-type:jwt"
Scripts: ./token.sh (usa o EXT_TOKEN portanto, defina a variável ambiental adequadamente)
Exemplo de resultado (truncado):
{
"access_token": "ey...A",
"issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
"token_type": "Bearer",
"expires_in": 1800,
"refresh_token": "ey...qA"
}
15. Verificar o acesso à API REST do PowerFlex
Esta etapa confirma que o token funciona chamando um endpoint REST do PowerFlex. Ele usa o access_token da saída do "token.sh", exportado como variável env PM_TOKEN.
exportar PM_TOKEN=eyJhb...eN_A
Comando:
curl -k --location --request GET https://$IN_IP/Api/V1/Credential --header 'Content-Type: application/json' --header "Authorization: Bearer $PM_TOKEN"
{
"totalRecords" : 3,
"credentialList" : [ {
"link" : {
"title" : "root",
"href" : "getCredential/69087b0c-cce7-4be7-b154-e8a3019cc553",
"rel" : "self",
"type" : null
},
"credential" : {
"type" : "OSCredential",
"id" : "69087b0c-cce7-4be7-b154-e8a3019cc553",
....
"link" : null,. "link" : null,. "link" : null, "references" : {
"devices" : 0,
"policies" : 0
}
} ]
}
Informações de referência
Resumo da sequência de API
- Inicializar o CIAM para PowerFlex
(/rest/v1/sso-ciam/init) - Configurar o PowerFlex como provedor
de serviços OIDC(/rest/v1/oidc-sp-config) - Adicionar certificados para serviços
CIAM(DigiCert, GlobalSign etc.) - Registrar o Microsoft Azure Entra ID como serviço
OIDC(/rest/v1/oidc-serviços) - Configurar a ID de serviço na guia
Autenticação do Microsoft Azure(Mapeamento de endpoint do agente) - Definir declarações de token e grupo no Microsoft Azure
(Declarações opcionais, permissões de API) - Adicionar client OAuth2 no CIAM
(/rest/v1/oauth2-clients) - Adicionar aplicativo ao CIAM para troca de
token(/rest/v1/oauth2-token-exchanges) - Obtenha o token do Microsoft Azure para trocá-lo pelo token
do PowerFlex(/rest/v1/token) - Verificar o acesso às APIs REST do PowerFlex
Comandos para realizar uma troca de token
Chamando APIs do PowerFlex com o token do Microsoft Azure Entra
Comando para realizar uma troca de tokens:
curl -kL -X POST https://$PFMP_IP/rest/v1/token \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header "ClientId: $CIAM_CLIENT_ID" \
--header "ClientSecret: $CIAM_CLIENT_SECRET" \
--data "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
--data "subject_token=${AZURE_TOKEN}" \
--data "subject_token_type=urn:ietf:params:oauth:token-type:jwt" | jq '.'
Exemplo:
curl -kL -X POST https://10.247.39.179/rest/v1/token \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header "ClientId: 77ce10cb-c40e-4c1e-b922-07014b5b6e7b" \
--header "ClientSecret: QXDtyVYO5l3Puj2ZMACz/MK+sTSOqDHy53oRhVkXiBc=" \
--data "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
--data "subject_token=${AZURE_TOKEN}" \
--data "subject_token_type=urn:ietf:params:oauth:token-type:jwt" | jq '.'
Chamando a API do equipamento PowerFlex Manager com token trocado
curl -kL 'https://10.247.39.179/api/v1/appliance' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMkNrM2YwNEI5OG5pRENza19IVmZ3R..._dxDp9QGWdteptby-8aaA'
Chamando a API de bloco do PowerFlex com token trocado
curl -kL GET https://10.247.39.179/api/types/Volume/instances --header 'Content-Type: application/json' --header "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzMkNrM2YwNEI5OG5pRENza19IVmZ3R..._dxDp9QGWdteptby-8aaA "
[
{
"genType": "EC",
"mappedSdcInfo": [
{
"limitIops": null,
"limitBwInMbps": null,
"isDirectBufferMapping": null,
"sdcIp": "",
"sdcId": "15d47a2400010000",
"sdcName": "513fda498aaf35e883da34f6ac46480",
"nqn": "nqn.2014-08.org.nvmexpress:uuid:72f30442-1cf7-0f5b-129c-da4fae6a028b",
"accessMode": "ReadWrite",
"hostType": "NVMeHost"
}
],
"managedBy": "ScaleIO",
"originalExpiryTime": 0,
"retentionLevels": [],
"snplIdOfSourceVolume": null,
"volumeReplicationState": "UnmarkedForReplication",
"replicationJournalVolume": false,
"replicationTimeStamp": 0,
"name": "csivol-21ef5b460c",
"creationTime": 1763382058,
"storagePoolId": "0ebdb61000000000",
"dataLayout": "ErasureCoding",
"vtreeId": "97957f7d00000002",
"sizeInKb": 8388608,
"compressionMethod": "NotApplicable",
"volumeClass": "defaultclass",
"accessModeLimit": "ReadWrite",
"lockedAutoSnapshotMarkedForRemoval": false,
"snplIdOfAutoSnapshot": null,
"pairIds": null,
"useRmcache": false,
"volumeType": "ThinProvisioned",
"consistencyGroupId": null,
"ancestorVolumeId": null,
"notGenuineSnapshot": false,
"secureSnapshotExpTime": 0,
"lockedAutoSnapshot": false,
"autoSnapshotGroupId": null,
"timeStampIsAccurate": false,
"nsid": 3,
"id": "77d698a400000002",
"links": [
{
"rel": "self",
"href": "/api/instances/Volume::77d698a400000002"
},
{
"rel": "/dtapi/rest/v1/metrics/query",
"href": "/dtapi/rest/v1/metrics/query",
"body": {
"resource_type": "volume",
"ids": [
"77d698a400000002"
]
}
},
{
"rel": "/api/parent/relationship/vtreeId",
"href": "/api/instances/VTree::97957f7d00000002"
},
{
"rel": "/api/parent/relationship/storagePoolId",
"href": "/api/instances/StoragePool::0ebdb61000000000"
}
]
},
{
"genType": "EC",
"mappedSdcInfo": null,
"managedBy": "ScaleIO",
"originalExpiryTime": 0,
"retentionLevels": [],
"snplIdOfSourceVolume": null,
"volumeReplicationState": "UnmarkedForReplication",
"replicationJournalVolume": false,
"replicationTimeStamp": 0,
"name": "csivol-4ea9633592",
"creationTime": 1763380456,
"storagePoolId": "0ebdb61000000000",
"dataLayout": "ErasureCoding",
"vtreeId": "9795586d00000000",
"sizeInKb": 8388608,
"compressionMethod": "NotApplicable",
"volumeClass": "defaultclass",
"accessModeLimit": "ReadWrite",
"lockedAutoSnapshotMarkedForRemoval": false,
"snplIdOfAutoSnapshot": null,
"pairIds": null,
"useRmcache": false,
"volumeType": "ThinProvisioned",
"consistencyGroupId": null,
"ancestorVolumeId": null,
"notGenuineSnapshot": false,
"secureSnapshotExpTime": 0,
"lockedAutoSnapshot": false,
"autoSnapshotGroupId": null,
"timeStampIsAccurate": false,
"nsid": 1,
"id": "77d6719400000000",
"links": [
{
"rel": "self",
"href": "/api/instances/Volume::77d6719400000000"
},
{
"rel": "/dtapi/rest/v1/metrics/query",
"href": "/dtapi/rest/v1/metrics/query",
"body": {
"resource_type": "volume",
"ids": [
"77d6719400000000"
]
.
.
.
]
}
]