简介
- Kerberos(KDC) 几个重要的概念:
1 | Principal:任何服务器所提供的用户、计算机、服务都将被定义成Principal。本例使用客户端使用:[email protected] mongodb服务端使用:mongodb/[email protected] |
- mongodb 启用kerberos
使用kerberos授权登录可以更大的增加安全性
安装带有kerberos认证的mongodb
安装kerberos
请参照网上相关的教程,作者后续会发布相关的安装教程
安装mongodb enterprice
这是企业版下载链接 mongodb enterprice
本次安装基于centos7.2
安装依赖的一些库
1
yum install cyrus-sasl cyrus-sasl-gssapi cyrus-sasl-plain krb5-libs libcurl libpcap lm_sensors-libs net-snmp net-snmp-agent-libs openldap openssl rpm-libs tcp_wrappers-libs -y
解压下载的mongodb
1 | # 解压 |
$ vi conf/mongod.conf #更改以下路径为自己的路径,ip为服务器的ip1
2
3
4
5
6
7
8
9
10
11
12dbpath=/root/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.0.2/data
#where to log
logpath=/root/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.0.2/mongodb.log
logappend=true
bind_ip = 10.211.55.5
port = 27017
# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
journal=true
- 创建对应的kerberos用户以及keytab文件(hz.com为我自己的主机名)
客户端用户:[email protected] mongodb服务端用户:mongodb/[email protected]
keytab文件:mongodb.keytab mongodb_hz.keytab
- 将mongodb目录下的bin文件夹加入到PATH
以下两句可以追加到文件末尾:/etc/profile 具体路径请根据自己的进行修改
1 | export MONGODB_HOME=/root/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.0.2 |
执行source,使上面的追加起作用
source /etc/profile
- 添加kerberos登录用户到mongodb
1 | cd $MONGODB_HOME |
- 使用kerberos认证启动mongodb
1 | 首先关闭上一个mongod服务,然后使用下面命令启动mongodb |
启动后如下图
- 使用kerberos,登录mongodb
1 | $ kdestory |
如下图,表示成功
使用java连接带有kerberos的mongodb
使用maven工程构建,依赖如下1
2
3
4
5
6
7
8
9
10<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.0-cdh5.13.0</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.8.2</version>
</dependency>
创建连接类MyMongo,请替换相关的用户名、host、krb5.conf、keytab文件位置等1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69package com.hz.mongodb;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;
import org.bson.Document;
import java.io.IOException;
import java.security.PrivilegedAction;
import java.security.PrivilegedExceptionAction;
import java.util.Arrays;
/**
* Created with hzz
* Description:
*
* @author: huangzhe
* @date: 2018-01-25
* @time: 下午20:14
*/
public class MyMongo {
public static void main(String[] args) {
Configuration conf = new Configuration();
conf.set("hadoop.security.authentication", "Kerberos");
System.setProperty("java.security.krb5.conf", "/Users/huangzhe/Downloads/krb5.conf");
UserGroupInformation.setConfiguration(conf);
MongoClient client = null;
try {
UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("[email protected]", "/Users/huangzhe/Downloads/mongodb.keytab");
try {
client=ugi.doAs((PrivilegedExceptionAction<MongoClient>) () -> {
MongoCredential credential = MongoCredential.createGSSAPICredential("[email protected]");
MongoClient result = new MongoClient(new ServerAddress("hz.com", 27017),
Arrays.asList(credential));
MongoDatabase db = result.getDatabase("ceshi");
MongoIterable<String> tbs = db.listCollectionNames();
MongoCursor<String> tbCursor = tbs.iterator();
System.out.println("连接mongodb 成功");
return result;
});
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("连接mongodb 失败");
}
//获取对应的表
MongoDatabase db = client.getDatabase("mybase");
MongoIterable<String> tbs = db.listCollectionNames();
MongoCursor<String> tbCursor = tbs.iterator();
while (tbCursor.hasNext()) {
System.out.println(tbCursor.next());
}
MongoCollection<Document> t = db.getCollection("test");
FindIterable<Document> ds = t.find();
MongoCursor<Document> ss = ds.iterator();
while (ss.hasNext()){
System.out.println(ss.next());
}
System.out.println(t.count());
}
}