neo4j使用详解(十六、集成Kerberos认证(Java/c#)——最全参考)

请添加图片描述

Neo4j系列导航:
neo4j安装及简单实践
cypher语法基础
cypher插入语法
cypher插入语法
cypher查询语法
cypher通用语法
cypher函数语法
neo4j索引及调优


1.简介

Kerberos是一种网络身份验证协议,它允许网络节点在网络上证明其身份。它通过使用密钥分发中心(KDC)来确保客户端标识是正确的。除了安全性之外,Kerberos还支持单点登录。这允许在登录到计算机后授予用户对数据库的访问权限,从而为用户提供了简单性。

  • Neo4j支持使用Kerberos:4.x、5.x版本支持

2.部署

官方的Neo4j Kerberos Add-on可用于通过Kerberos身份验证扩展Neo4j。该附加组件提供身份验证,并应与其他提供程序(如LDAP)一起用于授权。

  • Neo4j Kerberos Add-on v4.0.0与Neo4j的4.x和5.x所有版本兼容

Kerberos Add-on的部署步骤:
将kerberos-add-on.jar文件放在Neo4j安装的plugins/目录中。编辑neo4j.conf以启用Kerberos附加组件作为身份验证提供者。

  1. 为Kerberos配置Neo4j: Configure neo4j.conf

    #For authentication with kerberos-add-on
    dbms.security.authentication_providers=plugin-Neo4j-Kerberos
    dbms.security.authorization_providers=ldap#For authorization with LDAP
    dbms.security.ldap.host=ad.windomain.local
    dbms.security.ldap.authorization.use_system_account=true
    dbms.security.ldap.authorization.system_username=CN=neo4jservice,OU=IT-Services,DC=windomain,DC=local
    dbms.security.ldap.authorization.system_password=PASSWORD
    dbms.security.ldap.authorization.user_search_base=CN=Users,DC=windomain,DC=local
    dbms.security.ldap.authorization.user_search_filter=(&(objectClass=*)(SamAccountName={0}))
    dbms.security.ldap.authorization.group_membership_attributes=memberOf
    dbms.security.ldap.authorization.group_to_role_mapping= \"CN=Neo4j Read Only,CN=Users,DC=windomain,DC=local"      = reader; \"CN=Neo4j Read-Write,CN=Users,DC=windomain,DC=local"     = publisher; \"CN=Neo4j Schema Manager,CN=Users,DC=windomain,DC=local" = architect; \"CN=Neo4j Administrator,CN=Users,DC=windomain,DC=local"  = admin; \"CN=Neo4j Procedures,CN=Users,DC=windomain,DC=local"     = allowed_role
    
  2. 生成Kerberos keytab文件:
    为KDC中的Neo4j服务器创建一个服务用户。确保为Neo4j服务用户生成一个keytab,并将其放在conf目录中。在本例中,我们将其命名为neo4j.ktab。keytab将被Neo4j使用。

  3. 配置Kerberos Add-on:
    如果您已经通过Heimdal或MIT工具套件使用Kerberos,那么您有一个krb5.conf文件,其中包含有关如何访问KDC的信息。如果您没有这样的文件,或者不希望使用它,请在conf目录中创建一个新的krb5.conf文件。

    配置krb5.conf:
    在本例中,我们使用的是WINDOMAIN领域。LOCAL和KDC和管理服务器的IP地址192.168.38.2。将它们分别替换为KDC和管理服务器的实际领域和实际IP或域名。

    [libdefaults]
    default_realm = WINDOMAIN.LOCALdefault_tgs_enctypes = rc4-hmac rc4-hmac-exp aes128-cts-hmac-sha1-96 aes256-cts-hmac-sha1-96 des3-hmac-sha1
    default_tkt_enctypes = rc4-hmac rc4-hmac-exp aes128-cts-hmac-sha1-96 aes256-cts-hmac-sha1-96 des3-hmac-sha1
    permitted_enctypes = rc4-hmac rc4-hmac-exp aes128-cts-hmac-sha1-96 aes256-cts-hmac-sha1-96 des3-hmac-sha1[realms]
    WINDOMAIN.LOCAL = {kdc = 192.168.38.2admin_server = 192.168.38.2
    }[domain_realm]
    .windomain.local = WINDOMAIN.LOCAL
    windomain.local = WINDOMAIN.LOCAL
    

    Java本身不支持某些加密算法。当使用更高级的加密算法(例如ASE-256)时,确保运行Neo4j的Java启用了Java Cryptography Extension扩展。

    现在在conf目录中创建第二个名为kerberos.conf的文件。keytab设置引用上面创建的keytab文件。该服务。主体设置是该keytab中的主体,krb5.conf设置引用krb5.conf文件(已经从现有Kerberos安装中存在,或者在上面步骤中创建)。同样,根据您的设置将这些值替换为正确的值。

    配置kerberos.conf:

    realm=WINDOMAIN.LOCAL
    keytab=conf/neo4j.ktab
    service.principal=neo4j/neo4j.windomain.local@WINDOMAIN.LOCAL
    krb5.conf=conf/krb5.conf
    

3.使用

要使用Kerberos进行身份验证的客户机应用程序代码必须针对KDC进行身份验证,并获取Neo4j服务的服务票证(在我们的示例中:Neo4j /neo4j.windomain.local@WINDOMAIN.LOCAL)。服务ticket必须直接或封装在SPNEGO(1.3.6.1.5.5.2)中使用Kerberos v5(1.2.840.113554.1.2.2)机制。
服务ticket应该以以下属性的认证令牌形式提供给Neo4j驱动程序:

  • Principal: empty
  • Credentials: the Base64-encoded service ticket
  • Realm: add-on-Neo4j-Kerberos

Kerberos Add-on目前不能与Neo4j浏览器一起工作。它只适用于使用Neo4j驱动程序的应用程序

实例一:Java驱动
使用1.3 Java驱动程序的示例实现

public void connect()
{byte[] serviceTicket = get(serviceDomainName);String scheme = "ticket";String realm = "add-on-Neo4j-Kerberos";String encodedServiceTicket = Base64.getEncoder().encodeToString( serviceTicket );AuthToken token = AuthTokens.custom( encodedServiceTicket );try ( Driver driver = GraphDatabase.driver( "bolt://" + serviceDomainName, token ) ){// do interesting things}
}public byte[] get(String serviceDomainName) throws LoginException, GSSException
{Map<String,String> options = Collections.singletonMap( "useTicketCache", "true" );Krb5Configuration loginContextConfiguration = new Krb5Configuration( options );LoginContext loginContext = new LoginContext("KerberosClient",null, // this is the subjectnull, // no need for thisloginContextConfiguration);loginContext.login();return getServiceTicket( loginContext.getSubject(), "neo4j@" + serviceDomainName );
}
public static final Oid SPNEGO_OID = getOid( "1.3.6.1.5.5.2" );
public byte[] getServiceTicket(Subject subject, String servicePrincipalName) throws GSSException
{GSSManager manager = GSSManager.getInstance();GSSName serverName = manager.createName( servicePrincipalName, GSSName.NT_HOSTBASED_SERVICE );final GSSContext context = manager.createContext(serverName, SPNEGO_OID, null, GSSContext.DEFAULT_LIFETIME );// The GSS context initiation has to be performed as a privileged action.return Subject.doAs( subject, new PrivilegedAction<byte[]>(){public byte[] run(){try{// This is a one pass context initialisation.context.requestMutualAuth( false );context.requestCredDeleg( false );return context.initSecContext( new byte[0], 0, 0 );}catch ( GSSException e ){e.printStackTrace();return null;}}} );
}private class Krb5Configuration extends Configuration
{private final AppConfigurationEntry[] configList;public Krb5Configuration( Map<String,String> options ){this.configList = new AppConfigurationEntry[1];configList[0] =new AppConfigurationEntry("com.sun.security.auth.module.Krb5LoginModule",AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,options);}@Overridepublic AppConfigurationEntry[] getAppConfigurationEntry(String name){return configList;}
}

实例一:c#驱动
使用c#和1.3 . net驱动程序实现的示例

var token = AuthTokens.kerberos(getTicket("neo4j"));using (var driver = GraphDatabase.Driver("bolt://neo4j.windomain.local:7687", token)){try{using (var session = driver.Session()){var result = session.Run("MATCH () RETURN count(*) AS count");foreach (var record in result){Console.WriteLine($"Nodecount: {record["count"].As<string>()}");}}}catch (Exception e){Console.WriteLine($"Error: {e.Message}");}
}private static String getTicket(string serviceName){AppDomain.CurrentDomain.SetPrincipalPolicy(System.Security.Principal.PrincipalPolicy.WindowsPrincipal);var domain = Domain.GetCurrentDomain().ToString();using (var domainContext = new PrincipalContext(ContextType.Domain, domain)){string spn = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, serviceName).UserPrincipalName;Console.WriteLine("Service Principale name: " + spn);KerberosSecurityTokenProvider tokenProvider = new KerberosSecurityTokenProvider(spn);KerberosRequestorSecurityToken securityToken = tokenProvider.GetToken(TimeSpan.FromMinutes(1)) as KerberosRequestorSecurityToken;var token = securityToken.GetRequest();String ticket = Convert.ToBase64String(token);return ticket;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/305975.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业如何使用SNP Glue将SAP与Snowflake集成?

SNP Glue是SNP的集成技术&#xff0c;适用于任何云平台。它最初是围绕SAP和Hadoop构建的&#xff0c;现在已经发展为一个集成平台&#xff0c;虽然它仍然非常专注SAP&#xff0c;但可以将几乎任何数据源与任何数据目标集成。 我们客户非常感兴趣的数据目标之一是Snowflake。Sno…

uniapp 小程序获取WiFi列表

<template><view ><button click"getWifiList">获取WiFi列表</button><scroll-view:scroll-top"scrollTop"scroll-yclass"content-pop"><viewclass"itemInfo"v-for"(item, index) in wifiList&…

21. 【Android教程】评分条 RatingBar

本节将继续学习一个和进度有关的控件&#xff1a;RatingBar &#xff0c;在 Android 中 RatingBar 是一个可以支持用户打分的 UI 控件&#xff0c;相比 ProgressBar 而言&#xff0c;RatingBar 不仅仅可以用来展示同时还可以接收用户的输入操作&#xff1b;而相比 SeekBar&…

【Java面试题】MySQL上篇(索引)

文章目录 索引1.索引的分类&#xff1f;2.B树和B树的区别&#xff1f;2.1B树2.2B树 3.为什么使用索引会加快查询&#xff1f;4.创建索引的注意点&#xff1f;5.索引在哪些情况下会失效&#xff1f;6.聚簇索引和非聚簇索引的区别&#xff1f;7.回表查询是什么&#xff1f;8.什么…

flutter组件_AlertDialog

官方说明&#xff1a;A Material Design alert dialog. 翻译&#xff1a;一个材料设计警告对话框。 作者释义&#xff1a;显示弹窗&#xff0c;类似于element ui中的Dialog组件。 AlertDialog的定义 const AlertDialog({super.key,this.icon,this.iconPadding,this.iconColor,t…

IO_DAY7

1:实现2个终端之间的互相聊天 要求:千万不要做出来2个终端之间的消息发送是读一写的&#xff0c;一定要能够做到&#xff0c;一个终端发送n条消息&#xff0c;另一个终端一条消息都不回复都是没有问题的 终端A&#xff1a; #include<myhead.h> int main(int argc, char…

【LeetCode刷题笔记】LeetCode 1365.有多少小于当前数字的数字

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

设计模式之解释器模式(上)

解释器模式 1&#xff09;概述 1.定义 定义一个语言的文法&#xff0c;并且建立一个解释器来解释该语言中的句子&#xff0c;这里的“语言”是指使用规定格式和语法的代码。 2.结构图 3.角色 AbstractExpression&#xff08;抽象表达式&#xff09;&#xff1a;在抽象表达…

实况窗助力美团打造鸿蒙原生外卖新体验,用户可实时掌握外卖进展

自2023年华为宣布全新HarmonyOS NEXT蓄势待发&#xff0c;鸿蒙原生应用全面启动以来&#xff0c;已有金融、旅行、社交等多个领域的企业和开发者陆续宣布加入鸿蒙生态。其中&#xff0c;美团作为国内头部的科技零售企业&#xff0c;是首批加入鸿蒙生态的伙伴&#xff0c;其下的…

nginx+uwsgi 和nginx+gunicorn区别、如何部署

nginx + uwsgi: 高并发更稳定一些 nginx + gunicorn: 更方便 ,性能可以从其它方面入手 在架构上是这样的,nginx负责动态的转发和静态文件的直接访问,gunicorn/uwsgi作为网关服务用来解析http请求,后面的flask只是个application而已,没有server的服务特征。 首先浏览器发…

备考ICA----Istio实验17---TCP流量授权

备考ICA----Istio实验17—TCP流量授权 1. 环境准备 1.1 环境部署 kubectl apply -f <(istioctl kube-inject -f istio/samples/tcp-echo/tcp-echo.yaml) -n kim kubectl apply -f <(istioctl kube-inject -f istio/samples/sleep/sleep.yaml) -n kim1.2 测试环境 检测…

研究:基于大语言模型的模糊测试技术

源自&#xff1a;论文解读智能体 “人工智能技术与咨询” 发布 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨&#xff0c;并不意味着支持其观点或证实其内容的真实性。版权归原作者所有&#xff0c;如转载稿涉及版权等问题&#xff0c;请立即联…

分类预测 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机数据…

【Unity】组件组合使用心得(单行可自动拓展Scroll View)

在这之前&#xff0c;一直是在使用Scroll View进行滑动内容设置&#xff0c;但设置的都是不明不白的&#xff0c;而且有的时候设置好了之后也不知道是为什么&#xff0c;总感觉哪里不对劲&#xff0c;而且好也不知道为什么好&#xff0c;可能是长时间在做管理上的内容&#xff…

K8S资源管理之计算资源管理

1.详解Requests和Limits参数 以CPU为例&#xff0c;下图显示了未设置Limits与设置了Requests和Limits的CPU使用率的区别 尽管Requests和Limits只能被设置到容器上&#xff0c;但是设置了Pod级别的Requests和Limits能大大提高管理Pod的便利性和灵活性&#xff0c;因此在Kubernet…

C语言——实践小游戏(贪吃蛇)代码版

大家好久不见&#xff0c;我是残念我回来了&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#x…

DS数模-Mathorcup妈妈杯C题思路

2024Mathorcup数学建模挑战赛&#xff08;妈妈杯&#xff09;C题保姆级分析完整思路代码数据教学 C题题目&#xff1a;物流网络分拣中心货量预测及人员排班 接下来我们将按照题目总体分析-背景分析-各小问分析的形式来 总体分析&#xff1a;题目要求我们处理的是一个关于物流…

国芯科技(C*Core)车规MCU产品选型与应用

一、MCU市场概述 MCU&#xff08;Micro Controller Unit&#xff09;即微控制器&#xff0c;俗称单片机&#xff0c;是把 CPU 的规格与频率做适当缩减&#xff0c;并将ROM、RAM、A/D转换、各式I/O接口以及Timer等功能整合在单一芯片上&#xff0c;形成芯片级的计算机。 根据…

【应用】SpringBoot-自动配置原理

前言 本文简要介绍SpringBoot的自动配置原理。 本文讲述的SpringBoot版本为&#xff1a;3.1.2。 前置知识 在看原理介绍之前&#xff0c;需要知道Import注解的作用&#xff1a; 可以导入Configuration注解的配置类、声明Bean注解的bean方法&#xff1b;可以导入ImportSele…

Prototype 原型

意图 用原型实例指定创建对象的种类&#xff0c;并且通过复制这些原型创建新的对象。 结构 Prototype声明一个复制自身的接口。ConcretePrototype实现一个复制自身的操作。Client让一个原型复制自身从而创建一个新的对象。 适用性 当一个系统应该独立于他的产品创建、构成和…