栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Azure==Managed Identity to access Azure key vault==在azure虚拟机上不使用密码从key vault获取secret并在java程序中使用

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Azure==Managed Identity to access Azure key vault==在azure虚拟机上不使用密码从key vault获取secret并在java程序中使用

目录

1新建AKV vk03-MSI

2新建VM01

3在VM的identity进行设置

4在key vault中设置access policy

5部署在VM01上的应用,就能够访问到AKV了

6通过RDP连接上VM01

6通过远程桌面连接 连接到VM01

7 SSH连接上VM

 8 在VM上获取key vault中的secret ,并且不使用密码!!

10、直接通过powershell访问

11、在VM上直接HTTP请求

12、编写java代码并部署到VM上也可不通过密码获取secret

使用MI从AKV获取secret

1新建AKV vk03-MSI

2新建VM01

 

其他默认create

3在VM的identity进行设置

system asign -on

生成了Object(principal) ID,  复制这个ID

4在key vault中设置access policy

access policy

add access policy

secret management

选择权限

select principal

选择VM01 ,或者输入刚才复制的  Object(principal) ID 来搜索

 

 

5部署在VM01上的应用,就能够访问到AKV了

6通过RDP连接上VM01

 打开VM并开启3389端口用于RDP连接

 点击overview,connect,然后点击RDP,然后下载RDP文件,下载完成后打开,会提示输入用户名和密码,就是create VM的时候自己输入的,然后成功连接上了VM

6通过远程桌面连接 连接到VM01

在自己电脑上搜索并打开

 输入VM overview中的Public IP address 也可以同样连接上VM

7 SSH连接上VM

之前新建的虚拟机的windows的,需要新建linux的虚拟机才行,我这重新建了个Ubuntu的虚拟机

 其他默认,然后下载私钥并创建

然后同样的如xindows虚拟机一样,开启system托管标识,并且去key vault设置访问策略。

回到vm02,点击连接,SSH

打开XSHELL,新建会话,输入用户名,然后选择刚才下载的SSH文件即可

 

 

 

 8 在VM上获取key vault中的secret ,并且不使用密码!!

 VM上安装powershell

详谈Ubuntu PowerShell(小白入门必看教程) | 使用

 pwsh

Install-Module Az

Import-Module Az

Connect-AzAccount -Identity

遇到个报错,报错的原因是因为新建key vault和VM时,选择的位置不同,所以我新建个位置在east-asia的kv04-MSI,并给他配置了

PS /home/azureuser> Install-Module Az

Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its InstallationPolicy value by running the Set-PSRepository cmdlet.
 Are you sure you want to install the modules from 'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): Y
PS /home/azureuser> Import-Module Az      
                                                                              
PS /home/azureuser> Connect-AzAccount -Identity                                                                                                              

Account   SubscriptionName TenantId                             Environment
-------   ---------------- --------                             -----------
MSI@50342                  9c6f33c6-0a22-45e9-b129-78843f81e5f8 AzureCloud


//获取值并保存到本机
PS /home/azureuser> $secret = Get-AzKeyVaultSecret -VaultName kv04-MSI -Name SQLConnectionString  

//打印值
PS /home/azureuser> $secret.SecretValue |ConvertFrom-SecureString -AsPlainText
666666666666666666666666

可以看到,已经成功的在这台VM上获取到了key vault kv04-MSI中的值了。

9、编写java程序,并部署在VM02上,并且从kv04-MSI中获取值

VM上已经能够获取到KV中的值了。

在powershell中,将secret保存到txt中

PS /home/azureuser> $secret.SecretValue |ConvertFrom-SecureString -AsPlainText |Out-File xxx.txt -Encoding utf8   
PS /home/azureuser> ls
a.py  jdk-8u212-linux-x64.tar.gz  module  software  xxx.txt
PS /home/azureuser> cat ./xxx.txt
666666666666666666666666

安装jdk

 编写java程序从txt中读取想要的值

PS /home/azureuser> vim test.java
PS /home/azureuser> javac ./test.java
PS /home/azureuser> java test  
666666666666666666666666
PS /home/azureuser> ls
a.py  jdk-8u212-linux-x64.tar.gz  module  software  test.class	test.java  xxx.txt
import java.io.*;

public class test {
    public static void main(String args[]) throws IOException {
        String filePath = "/home/azureuser/xxx.txt";
        FileInputStream fin = new FileInputStream(filePath);
        InputStreamReader reader = new InputStreamReader(fin);
        BufferedReader buffReader = new BufferedReader(reader);
        String strTmp = "";
        while ((strTmp = buffReader.readLine()) != null) {
            System.out.println(strTmp);
        }
        buffReader.close();
    }
}

暂时完成。

方法有点丑,暂时实现了不需要密码从key vault获取secret了,对powershell熟悉的话可以学下永久设置成环境变量,那java代码直接读取环境变量就行了。还可以编写sh文件自动执行脚本,不需手输。

垃圾微软云!!!!!真难用

========================================================

拓展:

将secret保存到环境变量中,方便java程序调用

10、直接通过powershell访问

教程:使用托管标识访问 Azure Key Vault - Windows - Azure AD - Microsoft Entra | Microsoft Docs

11、在VM上直接HTTP请求

教程`:`使用托管标识访问 Azure Key Vault - Linux - Azure AD - Microsoft Entra | Microsoft Docs

通过SSH登上VM

在终端窗口中,使用 CURL 向 Azure 资源终结点的本地托管标识发出请求,以获取 Azure Key Vault 的访问令牌。     下面是用于获取访问令牌的 CURL 请求。 

azureuser@vmtest0614:~$ curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' -H Metadata:true

//返回的令牌信息
{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImpTMVhvMU9XRGpfNTJ2YndHTmd2UU8yVnpNYyIsImtpZCI6ImpTMVhvMU9XRGpfNTJ2YndHTmd2UU8yVnpNYyJ9.eyJhdWQiOiJodHRwczovL21hbmFnZW1lbnQuYXp1cmUuY29tLyIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzljNmYzM2M2LTBhMjItNDVlOS1iMTI5LTc4ODQzZjgxZTVmOC8iLCJpYXQiOjE2NTUyMDkwMzAsIm5iZiI6MTY1NTIwOTAzMCwiZXhwIjoxNjU1Mjk1NzMwLCJhaW8iOiJFMlpnWU9pSjUvdFRjM242dmY2ZmhRa0NoLzg3QWdBPSIsImFwcGlkIjoiZjRkMmRkYWEtNWQ0NS00OGUyLWI4MzAtMDNiODhiMDU3YWE2IiwiYXBwaWRhY3IiOiIyIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvOWM2ZjMzYzYtMGEyMi00NWU5LWIxMjktNzg4NDNmODFlNWY4LyIsImlkdHlwIjoiYXBwIiwib2lkIjoiMTU0MzExM2UtNmQ4Ny00ZTBiLTlkMGQtODBlMTc3Y2I0YzQyIiwicmgiOiIwLkFYRUF4ak52bkNJSzZVV3hLWGlFUDRIbC1FWklmM2tBdXRkUHVrUGF3ZmoyTUJPSEFBQS4iLCJzdWIiOiIxNTQzMTEzZS02ZDg3LTRlMGItOWQwZC04MGUxNzdjYjRjNDIiLCJ0aWQiOiI5YzZmMzNjNi0wYTIyLTQ1ZTktYjEyOS03ODg0M2Y4MWU1ZjgiLCJ1dGkiOiIzTXI1SjF5bTJrYUJpQmUtSVVaakFBIiwidmVyIjoiMS4wIiwieG1zX21pcmlkIjoiL3N1YnNjcmlwdGlvbnMvMWUwODRlNDQtODZjYi00NDY5LWE3YjQtMTQ0Mjg1ZjBmMmNiL3Jlc291cmNlZ3JvdXBzL3JndGVzdDA2MTQvcHJvdmlkZXJzL01pY3Jvc29mdC5Db21wdXRlL3ZpcnR1YWxNYWNoaW5lcy92bXRlc3QwNjE0IiwieG1zX3RjZHQiOiIxNjUzNDgwMDA1In0.iqPWMbiCpp-Gbda3XAtkzdWoXm-iVA4SqIioHSy3_S75FramxbVR3qfMKH0MLp8ZPy4X9gh010UQN04Np__Q6EX8Cug8OVrVS_tj2OxQ9VWEHCyADcZ86i-IH8TPHz5j4DfB3Mlg9bQY-g1cC55nBL0lenbpnMC0PeOopiYrAoSMO2MYeOyrda-FLAtENKw7DZ9khsUpI8gt-vt8aqAky3V4O9G5Vxz-tDDlRbcCxuPyu4M4ZIi2APWfgdprnaLCseAY6sGkD1aTyzQJ6KNFWA0zxc1S_gz2ZSoWiJ8kjwsUmqPBv2W6hLgsd2Xk3tFtYp6uz00bLfUwswSz1hR7Xg","client_id":"f4d2ddaa-5d45-48e2-b830-03b88b057aa6","expires_in":"86400","expires_on":"1655295730","ext_expires_in":"86399","not_before":"1655209030","resource":"https://management.azure.com/","token_type":"Bearer"}

将令牌格式化之后为

{
	"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImpTMVhvMU9XRGpfNTJ2YndHTmd2UU8yVnpNYyIsImtpZCI6ImpTMVhvMU9XRGpfNTJ2YndHTmd2UU8yVnpNYyJ9.eyJhdWQiOiJodHRwczovL21hbmFnZW1lbnQuYXp1cmUuY29tLyIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzljNmYzM2M2LTBhMjItNDVlOS1iMTI5LTc4ODQzZjgxZTVmOC8iLCJpYXQiOjE2NTUyMDkwMzAsIm5iZiI6MTY1NTIwOTAzMCwiZXhwIjoxNjU1Mjk1NzMwLCJhaW8iOiJFMlpnWU9pSjUvdFRjM242dmY2ZmhRa0NoLzg3QWdBPSIsImFwcGlkIjoiZjRkMmRkYWEtNWQ0NS00OGUyLWI4MzAtMDNiODhiMDU3YWE2IiwiYXBwaWRhY3IiOiIyIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvOWM2ZjMzYzYtMGEyMi00NWU5LWIxMjktNzg4NDNmODFlNWY4LyIsImlkdHlwIjoiYXBwIiwib2lkIjoiMTU0MzExM2UtNmQ4Ny00ZTBiLTlkMGQtODBlMTc3Y2I0YzQyIiwicmgiOiIwLkFYRUF4ak52bkNJSzZVV3hLWGlFUDRIbC1FWklmM2tBdXRkUHVrUGF3ZmoyTUJPSEFBQS4iLCJzdWIiOiIxNTQzMTEzZS02ZDg3LTRlMGItOWQwZC04MGUxNzdjYjRjNDIiLCJ0aWQiOiI5YzZmMzNjNi0wYTIyLTQ1ZTktYjEyOS03ODg0M2Y4MWU1ZjgiLCJ1dGkiOiIzTXI1SjF5bTJrYUJpQmUtSVVaakFBIiwidmVyIjoiMS4wIiwieG1zX21pcmlkIjoiL3N1YnNjcmlwdGlvbnMvMWUwODRlNDQtODZjYi00NDY5LWE3YjQtMTQ0Mjg1ZjBmMmNiL3Jlc291cmNlZ3JvdXBzL3JndGVzdDA2MTQvcHJvdmlkZXJzL01pY3Jvc29mdC5Db21wdXRlL3ZpcnR1YWxNYWNoaW5lcy92bXRlc3QwNjE0IiwieG1zX3RjZHQiOiIxNjUzNDgwMDA1In0.iqPWMbiCpp-Gbda3XAtkzdWoXm-iVA4SqIioHSy3_S75FramxbVR3qfMKH0MLp8ZPy4X9gh010UQN04Np__Q6EX8Cug8OVrVS_tj2OxQ9VWEHCyADcZ86i-IH8TPHz5j4DfB3Mlg9bQY-g1cC55nBL0lenbpnMC0PeOopiYrAoSMO2MYeOyrda-FLAtENKw7DZ9khsUpI8gt-vt8aqAky3V4O9G5Vxz-tDDlRbcCxuPyu4M4ZIi2APWfgdprnaLCseAY6sGkD1aTyzQJ6KNFWA0zxc1S_gz2ZSoWiJ8kjwsUmqPBv2W6hLgsd2Xk3tFtYp6uz00bLfUwswSz1hR7Xg",
	"client_id": "f4d2ddaa-5d45-48e2-b830-03b88b057aa6",
	"expires_in": "86400",
	"expires_on": "1655295730",
	"ext_expires_in": "86399",
	"not_before": "1655209030",
	"resource": "https://management.azure.com/",
	"token_type": "Bearer"
}

12、编写java代码并部署到VM上也可不通过密码获取secret

教程`:`使用托管标识访问 Azure Key Vault - Linux - Azure AD - Microsoft Entra | Microsoft Docs

Azure Identity client library for Java | Microsoft Docs

这里一定要里一个概念,这些云上的东西底层封装得太死了,比如新建java项目的时候,引入了azure的包,这个项目必须到之前开启了system managed identity的那台azure虚拟机上才行,然后直接调用包内提供的方法,会自动调用虚拟机后台去azure AD验证授权并且获取访问之前设置了access policy的key vault的token,而且这个token是直接存在框架里的,很不直观,构建了一个SecretClient,然后可以通过这个SecretClient对相应的key vault进行CRUD操作,能进行哪些操作还要看之前access policy中add的时候允许了一些什么。

从头开始理以下步骤:

        创建VM,设置identity获取objectID(principle ID)

        创建Key Vault,设置access policy,创建secret

        本地编写java代码,打包后部署到VM上即可,开放对应的端口

        访问测试

上述步骤依次完成后的截图

 

 

 

 

 

 主要代码如下:

依赖包:



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.6.8
         
    
    com.example
    msikeyvault
    0.0.1-SNAPSHOT
    msikeyvault
    msikeyvault
    
        1.8
    
    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            com.azure
            azure-identity
            1.5.2
        
        
            com.azure
            azure-security-keyvault-secrets
            4.4.1
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                        
                            org.projectlombok
                            lombok
                        
                    
                
            
        
    


package com.example.msikeyvault.test;

import com.azure.identity.ManagedIdentityCredential;
import com.azure.identity.ManagedIdentityCredentialBuilder;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;
import com.azure.security.keyvault.secrets.models.KeyVaultSecret;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class ManagedIdentity {
    
//    public void createManagedIdentityCredential() {
//        ManagedIdentityCredential managedIdentityCredential = new ManagedIdentityCredentialBuilder()
//                .clientId("") // only required for user assigned
//                .build();
//
//        // Azure SDK client builders accept the credential as a parameter
//        SecretClient client = new SecretClientBuilder()
//                .vaultUrl("https://{YOUR_VAULT_NAME}.vault.azure.net")
//                .credential(managedIdentityCredential)
//                .buildClient();
//        KeyVaultSecret secrettest = client.getSecret("secrettest");
//
//        System.out.println(secrettest.getValue());
//    }

    
    public String createManagedIdentityCredential() {
        ManagedIdentityCredential managedIdentityCredential = new ManagedIdentityCredentialBuilder()
                .build();

        // Azure SDK client builders accept the credential as a parameter
        SecretClient client = new SecretClientBuilder()
                .vaultUrl("https://mykv0614.vault.azure.net")
                .credential(managedIdentityCredential)
                .buildClient();

        KeyVaultSecret secrettest = client.getSecret("secrettest");

        System.out.println(secrettest.getValue());
        return secrettest.getValue();
    }
}
package com.example.msikeyvault;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MsikeyvaultApplication {

    public static void main(String[] args) {
        SpringApplication.run(MsikeyvaultApplication.class, args);
    }

}

 完整代码地址:

https://github.com/hebian1994/msikeyvault.git

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/974393.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号