[Azure] databricks通过服务主体(service principals)和azure key vaults访问Blob storage
Service Principal 是Azure Active Directory中的一个应用程序,它被授权访问Azure中的资源。此访问受到分配给服务主体的角色的限制,从而使您能够控制哪些资源可以访问以及在哪个级别上访问,使用专用应用程序服务主体service principals进行本地开发,可以在应用开发期间遵循最低特权原则。
如何将他们经脉全部打通,需要进行以下步骤:
1,在 Microsoft Azure Portal 创建一个blob storage,并创建一个容器container。
2,在Azure Active Directory创建应用注册,并创建密钥。
3,创建key vault,把应用注册的appID和密钥存储在key vault。
4,在blob storage给service principal授予访问的权限。
5,给databricks创建secret scope,并关联key vault。
6,在databricks 访问blob storage。
一,创建Blob storage,并创建容器container
登录 Microsoft Azure Portal 在左上角三横线找到存储账户storage accounts点进去。

点创建create,配置好信息,起好名后点审核创建review,create.

等待部署完成后,再次回到存储账户storage accounts就可以看到你自己的blob storage啦。

点进去,找到容器container,创建create,给个名字创建就行。

二,在Azure Active Directory创建应用注册service principal,并创建密钥
找到Azure Active Directory点进去,找到应用注册App registrations,点击新注册。

起好名字后点注册。
注册后你就可以看到注册的client ID 等信息。
Application (client) ID:注册的app实例的ID
Directory (tenant) ID:app实例注册到Azure AD tenant ID就是Directory ID。

为该app添加app secret(验证密钥),以访问该app
使用app生成验证密钥(authentication key、application password、client secret 或application secret),利用该密钥来验证app。
打开“Certificates & secrets”页面,点击“+New client secret”来创建新的Client Secret:
输入Description,选择过期日期,点击“Add”生成新的client secrets:

当点击Add时,client secret(authentication key)将会出现。你只有一次机会可以复制value。当你离开这个页面时,你永远没有机会再获取到value。
注意:复制Client Secret 的Value字段,当执行其他操作之后,这个值将无法再被查看到,请先复制保存起来。

三,创建key vault,把应用注册的appID和密钥存储在key vault
在主页找到密钥保管库Key vaults,点进去,创建create.起好key vault name

按next,访问策略Access policy可以加入对service principal(SP)的访问控制,或者建好后也可以在访问策略那栏加进去。

配置好信息后创建create,返回key vaults就可以看到创建好的key vault.

点击key valut 进去,创建密钥,保存应用注册的client ID 和 secret。

创建密钥secret,把上面应用注册的Application (client) ID保存到key vault。

起好名字,把值复制进去后创建create。

再创建一个密钥secret,把应用注册的密钥也保存进去。下面是上面创建好的应用注册SP 密钥。

起好名字,把之前保存的SP 密钥复制进去创建。

这样就在key vault 里保存了两个重要信息,在databricks里访问这个key vault里的密钥值就能拿到里面的密码值。

点击key vault左边栏的属性Properties就可以看到key vault的详细信息。里面的vault URI 和Resource ID需要配置在databricks 的secret scope里,这样databricks才能通过key vault拿到保存在key vault里的密钥进行身份验证。

四, 在blob storage给service principal授予访问的权限
回到存储账户storage account,进去刚才上面建的blob stoarge,找到访问控制Access Control(IAM),点击“+ Add”,选择添加角色分配“Add role assignment”。
打开“Add role assignment”页面,在Role列表中选择参与者“Contributor”角色,在“Members”列表中选择“User、group or service principal”,在“Select”列表中选择之前注册的app,点击“Save”按钮,完成权限的授予。

完成授权,这样应用注册,service principal就有权限访问这个blob storage了。
五,给databricks创建secret scope,并关联key vault
Databricks 使用Secret Scope来管理Secret,Secret Scope是由Secret构成的,该Secret是由name来唯一标识的。
根据Databricks实例,导航到创建Secret Scope的页面,注意该URI是区分大小写的。
https://<databricks-instance>#secrets/createScope
e.g.:https://adb-2069741479702555.15.azuredatabricks.net/?o=2069741479702555#secrets/createScope
打开网页,把名字填好,key vault URI,和Resource ID 填进去,点create,这样databricks就能访问到key vault里保存的密钥值了。

六,在databricks 访问blob storage
在notebook通过oauth2的service principal访问blob storage
##设置值
dbutils.widgets.text(name='tenant_id',defaultValue='f2a9b246-63f8-xxx-xxxx-18a31b24e46a',label='src_tenant_id')
dbutils.widgets.text(name='secret_scope',defaultValue='databricks-sp-20230402',label='secret_scope')
dbutils.widgets.text(name='id_secret',defaultValue='app-client-id-secret',label='id_secret')
dbutils.widgets.text(name='password_secret',defaultValue='app-client-secret-password',label='password_secret')
dbutils.widgets.text(name='storage_account',defaultValue='blobstorage20230402',label='storage_account')
dbutils.widgets.text(name='container',defaultValue='container20230402',label='scontainer')
##获取值
src_tenant_id = dbutils.widgets.get("tenant_id")
src_secret_scope = dbutils.widgets.get("secret_scope")
src_id_secret = dbutils.widgets.get("id_secret")
src_password_secret = dbutils.widgets.get("password_secret")
src_storage_account = dbutils.widgets.get("storage_account")
src_container = dbutils.widgets.get("container")
##获取权限
spark.conf.set("fs.azure.account.auth.type." + src_storage_account + ".dfs.core.windows.net", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type." + src_storage_account+".dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id." + src_storage_account + ".dfs.core.windows.net", dbutils.secrets.get(scope = secret_scope,key=id_secret))
spark.conf.set("fs.azure.account.oauth2.client.secret." + storage_account + ".dfs.core.windows.net", dbutils.secrets.get(scope = secret_scope,key=password_secret))
spark.conf.set("fs.azure.account.oauth2.client.endpoint." + storage_account + ".dfs.core.windows.net", "https://login.microsoftonline.com/"+ tenant_id +"/oauth2/token")
root_path ="abfss://" + container+"@" + storage_account+".dfs.core.windows.net/"
print("root_path:",root_path)
dbutils.fs.ls(root_path)
更多推荐


所有评论(0)