创建超级用户admin
#### 用途:相当于root用户,因为root用户我们会禁止远程登录
01:用来充当root用户的角色。
02:它不会用来运行任何的应用。
#### 用户的基本要求
01:用户要能够远程登录,要有家目录。
02:用户不能过期、密码得复杂化,密码是否过期是另外一回事。
03:用户的主组为admin,用户的辅组为wheel。
04:用户得被visudo授权为:admin ALL=(ALL:ALL) NOPASSWD: ALL
#### 创建用户的命令
chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow
groupadd -g 91 wheel
groupadd -g 1000 admin
useradd admin -u 1000 -g admin -G wheel -m -s /bin/bash
echo "admin:123456\!@#"|chpasswd
echo "admin ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers
visudo -c
创建普通用户app
#### 用途:用来运行1024端口以上的应用
01:用来运行1024端口及以上的应用,即ps -ef | grep "服务名" 结果中的第一
列的内容得是app。
02:所有服务的启停、开机自启动都用systemctl来管理。
03:这个app用户要能够使用systemctl来启停服务、开机自启动管理。
#### 用户的基本要求
01:用户要能够远程登录,要有家目录。
02:用户不能过期、密码得复杂化,密码是否过期是另外一回事。
#### 创建普通用户app的命令
sudo chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow
sudo groupadd -g 1001 app
sudo useradd app -u 1001 -g app -m -s /bin/bash
echo "app:Chenliang\!@#" | sudo chpasswd
软件下载地址
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-6.0.4.tgz
创建相关的目录
sudo mkdir -p /data/soft
sudo ls -ld /data/soft
安装mongodb服务端软件
#### 安装mongodb服务端软件
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-6.0.4.tgz
ls -l mongodb-linux-x86_64-ubuntu2004-6.0.4.tgz
sudo tar xf mongodb-linux-x86_64-ubuntu2004-6.0.4.tgz -C /data/soft/
sudo ln -svf /data/soft/mongodb-linux-x86_64-ubuntu2004-6.0.4 /data/soft/mongodb
sudo chown -R app:app /data/soft/
ls -l /data/soft/mongodb/bin
# 里面只有mongod mongos install_compass 这三个命令
# 没有mongo命令了
#### 配置环境变量
ls -ld /data/soft/mongodb/bin
sudo bash -c "cat >>/etc/profile" <<'EOF'
export PATH=/data/soft/mongodb/bin:$PATH
EOF
source /etc/profile
which mongod mongos
安装mongosh客户端工具,因为6.0版本默认没有mongo命令了,所以这里安装mongosh
#### 软件下载地址,这个得根据自己的操作系统版本,及系统上Openssl的版本
wget https://downloads.mongodb.com/compass/mongodb-mongosh-shared-openssl11_1.8.0_amd64.deb
#### 安装
ls -l mongodb-mongosh-shared-openssl11_1.8.0_amd64.deb
sudo dpkg -i mongodb-mongosh-shared-openssl11_1.8.0_amd64.deb
which mongosh
sudo ln -svf $(which mongosh) /data/soft/mongodb/bin/mongosh
sudo ls -l /data/soft/mongodb/bin/mongosh
sudo mkdir -p /data/apps/mongodb/27017/{data,conf,logs,run,keys,scripts}
sudo tree /data/apps/mongodb/27017
sudo bash -c "cat >/data/apps/mongodb/27017/conf/mongod.conf" <<'EOF'
## network
net:
port: 27017
ipv6: false
bindIpAll: false
bindIp: 0.0.0.0
maxIncomingConnections: 3000
wireObjectCheck: true
unixDomainSocket:
enabled: true
pathPrefix: /data/apps/mongodb/27017/run
filePermissions: 0700
## storage
storage:
dbPath: /data/apps/mongodb/27017/data
journal:
enabled: true
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 2
## log
systemLog:
destination: file
logAppend: false
path: /data/apps/mongodb/27017/logs/mongod.log
quiet: false
## process
processManagement:
fork: true
pidFilePath: /data/apps/mongodb/27017/run/mongod.pid
timeZoneInfo: /usr/share/zoneinfo/Asia
## security
security:
authorization: enabled
javascriptEnabled: false
EOF
准备启停脚本
sudo bash -c 'cat >/data/apps/mongodb/27017/scripts/mongod.sh' <<'EOF'
#!/bin/bash
#
# Explain: MongoDB start、stop scripts
#
# Define variables
RETVAL=0
MonPort="27017"
MonConf="/data/apps/mongodb/$MonPort/conf/mongod.conf"
MonCommPath="/data/soft/mongodb/bin"
# Define functions
start(){
MonStatusCheck="$(ss -lntup|grep -w "$MonPort"|wc -l)"
if [ "$MonStatusCheck" -eq 0 ];then
$MonCommPath/mongod -f $MonConf --fork >/dev/null 2>&1
RETVAL=$?
if [ $RETVAL -eq 0 ];then
echo "Start mongodb service[$MonPort] success"
else
echo "Start mongodb service[$MonPort] fail"
fi
else
echo "mongodb service[$MonPort] is running"
fi
return $RETVAL
}
stop(){
MonStatusCheck="$(ss -lntup|grep -w "$MonPort"|wc -l)"
if [ "$MonStatusCheck" -ne 0 ];then
$MonCommPath/mongod --shutdown -f $MonConf >/dev/null 2>&1
RETVAL=$?
if [ $RETVAL -eq 0 ];then
echo "Start mongodb service[$MonPort] success"
else
echo "Start mongodb service[$MonPort] fail"
fi
else
echo "mongodb service[$MonPort] is not running"
fi
return $RETVAL
}
status(){
MonStatusCheck="$(ss -lntup|grep -w "$MonPort"|wc -l)"
if [ "$MonStatusCheck" -ne 0 ];then
echo "mongodb service[$MonPort] is running"
else
echo "mongodb service[$MonPort] is not running"
fi
return $RETVAL
}
# case call define functiosn
case "$1" in
start)
start
RETVAL=$?
;;
stop)
stop
RETVAL=$?
;;
restart)
stop
sleep 5
start
RETVAL=$?
;;
status)
status
RETVAL=$?
;;
*)
echo "USAGE:$0{start|stop|restart|status}"
exit 1
esac
EOF
给脚本加可执行权限
sudo chmod 700 /data/apps/mongodb/27017/scripts/mongod.sh
ls -l /data/apps/mongodb/27017/scripts/mongod.sh
更改属主/组为app
sudo chown -R app:app /data/apps/mongodb/
将脚本加入systemctl中
#### 编写/etc/systemd/system/mongod27017.service文件
sudo bash -c "cat >/etc/systemd/system/mongod27017.service" <<'EOF'
[Unit]
Description=mongod instance
After=network.target
[Service]
Type=forking
User=app
Group=app
ExecStart=/bin/bash /data/apps/mongodb/27017/scripts/mongod.sh start
ExecStop=/bin/bash /data/apps/mongodb/27017/scripts/mongod.sh stop
LimitNOFILE=65535
Restart=on-failure
RestartSec=10
RestartPreventExitStatus=1
PrivateTmp=false
[Install]
WantedBy=multi-user.target
EOF
#### 加载
sudo systemctl daemon-reload
#### 授权
sudo chown -R app:app /etc/systemd/system/mongod27017.service
让普通用户app在可执行sudo systemctl stop mongod27017.service这样的命令,
#### 进行visudo授权
sudo bash -c "cat >/etc/sudoers.d/mongod27017_systemctl" <<'EOF'
## Cmnd Alias
Cmnd_Alias MONGOD27017_SYSTEMCTL = /usr/bin/systemctl daemon-reload, \
/usr/bin/systemctl start mongod27017.service, \
/usr/bin/systemctl stop mongod27017.service, \
/usr/bin/systemctl restart mongod27017.service, \
/usr/bin/systemctl status mongod27017.service, \
/usr/bin/systemctl enable mongod27017.service, \
/usr/bin/systemctl disable mongod27017.service, \
/usr/bin/systemctl is-enabled mongod27017.service
## auth
app ALL=(ALL:ALL) NOPASSWD: MONGOD27017_SYSTEMCTL
EOF
#### 更改visudo授权时文件的权限,并visudo -c
sudo chmod 0440 /etc/sudoers.d/mongod27017_systemctl
sudo visudo -c
#### 先看一看
sudo -u app sudo -l
#### 启动mongodb27017实例
sudo -u app sudo systemctl start mongod27017.service
sudo ps -aux | grep mongod
ss -lntup | grep 27017
#### 停止mongodb27017实例
sudo -u app sudo systemctl stop mongod27017.service
sudo ps -aux | grep mongod
ss -lntup | grep 27017
#### 再次启动
sudo -u app sudo systemctl start mongod27017.service
sudo ps -aux | grep mongod
ss -lntup | grep 27017
sudo systemctl enable mongod27017.service
sudo systemctl is-enabled mongod27017.service
我这里创建一个root用户,角色为root,因为角色为root,其库必须得为admin库。且我会开启root用户的身份验证(只允许client地址为127.0.0.1的登录,这样一来这个root用户就是个本地用户,只能在mongodb实例所在服务器上用mongosh 127.0.0.1:27017这样的方式去登录,然后到admin库下去认证。)
// 连接mongodb实例,进入到admin库,我mongodb实例才部署好,哪来的认证
// 连接的时候只能是127.0.0.1,因为我的配置文件中有开启安全认证
mongosh 127.0.0.1:27017
use admin;
// 这里创建用户并且同时(这里是必须)授于角色为root,db只能是admin
db.createUser(
{
user:"root",
pwd:"root123456",
roles: [
{ role:"root",db:"admin" }
]
}
);
// 进行认证
db.auth("root","root123456")
// 开启其身份验证,其实在创建用户时就可以,但我们这里是才部署好,都没有
// 超级用户。
db.updateUser(
"root",
{
authenticationRestrictions:[
{
clientSource: ["127.0.0.1"]
}
]
}
);
// 查看root用户
db.getUser("root"); // 看不到身份验证的相关信息
db.system.users.find( {user:"root"} ); // 就可看到身份验证
// 退出连接
exit;
// 连接,这里使用mongosh 172.31.7.111:27017 来进行连接
// 认证时使用root用户,会报错,因为root用户开启了身份验证的
// 再用mongosh 127.0.0.1:27017去连接,然后认证时使用root用户
// 是可以成功的
这里创建一个远端的超级用户,这个超级用户的名称可以以你公司的名称来命名,所以它并不是一个人类用户。就不对该用户开启身份验证了,这个用户我们就可以结navicat这样的工具来连接mongodb实例了。
// 本地以root用户登录并认证
mongosh 127.0.0.1:27017
use admin;
db.auth("root","root123456");
// 创建aliang用户,角色为root,认证库必须为admin(得在admin库下创建用
// 户),库也得为admin。
use admin;
db.createUser(
{
user: "aliang",
pwd: "aliang123456",
roles: [
{ role:"root",db:"admin" }
]
}
);
// 查看用户
use admin;
db.system.users.find( {user:"aliang"} );
db.getUser("aliang");
// 进行认证
db.auth("aliang","aliang123456");
// 退出登录
exit;
以本地管理员用户登录
mongosh 127.0.0.1
use admin;
db.auth("root","root123456");
创建wyc业务库
// 进入并创建wyc库,并创建test集群
use wyc;
db.createCollection("test");
// 往test集合中插入两条数据
db.test.insertMany(
[
{name:"chenliang01",age:"11"},
{name:"chenliang02",age:"12"}
]
);
// 查看test集合中的前10条文档(记录)
db.test.find().limit(10);
创建一个名为wyc的用户并进行授于相关角色
// 我是进入到wyc库的哈
use wyc;
// 创建用户,设置密码,没有授于角色(后面会授予的)
db.createUser(
{
user:"wyc",
pwd:"wyc123456",
roles: []
}
);
// 查看wyc用户
db.getUser("wyc");
// 对wyc用户授于readWrite角色
db.grantRolesToUser(
"wyc",
[
{role:"readWrite",db:"wyc"}
]
);
// 查看wyc用户
db.getUser("wyc");
对wyc这个web帐户进行认证
// 进入到wyc库后,认证wyc用户
use wyc;
db.auth("wyc","wyc123456");
// 查看有哪些库,只能看到wyc库,进入wyc库,查看test集群
show dbs;
show tables;
db.test.find().limit(10);
// 退出连接
exit;