Linux 安装软件

安装软件安全考虑尽量不安装在root用户下。比如数据库mysql建立mysql用户,oracle建立oracle账号,MongoDB建立MongoDB账号,数据比较重要所以都独立一个账号,对于不存储数据的中间件可以在需要用的普通站号里面安装,还可能存在不同程序需要不同版本的中间件。
docker比较特别,默认不能使用非root用户,可以给普通用户加入到docker组。在普通用户下安装的话得有sudo权限,docker的目录得这样分配root:docker权限。

非root用户安装软件一般都是采用源码安装。

相关基础概念

bashrc

bash 在每次启动时都会加载 .bashrc 文件的内容。每个用户的 home 目录都有这个 shell 脚本。它用来存储并加载你的终端配置和环境变量。也就是可以设置命令别名,配置命令的环境变量路径。

使修改生效:source ~/.bashrc

wheel组

类似于一个管理员的组,还可以进一步控制,只允许wheel组的用户su到root

1
2
3
4
# 相关配置
vim /etc/sudoers # 可以配置wheel组使用sudo 命令不需要密码 ,需要添加NOPASSWD: ALL,修改后wq!
sudo date # 测试命令
sudo su - root # 加sudo才可以不用密码

/etc/subuid /etc/subgid

Linux 命名空间为运行中的进程提供了隔离,限制他们对系统资源的访问,而进程没有意识到这些限制。

防止容器内的特权升级攻击的最佳方法是将容器的应用程序配置为作为非特权用户运行。对于其进程必须作为容器中的 root 用户运行的容器,可以将此用户重新映射到 Docker 主机上权限较低的用户。映射的用户被分配了一系列 UID,这些 UID 在命名空间内作为从 0 到 65536 的普通 UID 运行,但在主机上没有特权。

docker:100300:65536 这意味着 docker将从 100300开始,在后面的 65536 个整数中按顺序为用户分配一个 ID。例如,命名空间中的 UID 100300映射到容器中的 UID 0(root),UID 100301映射为 UID 1,依此类推。如果某个进程尝试提升特权到命名空间外部,则该进程将作为主机上无特权的高数字 UID 运行,该 UID 甚至不映射到真实用户。这意味着该进程完全没有主机系统的权限。

Docker

Docker 19.03中发布了一个重要的特性 “Rootless Container”,支持非root用户,稳定性待验证。

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
# 1.创建用户
useradd docker
passwd docker
# 2.添加到sudoers组
usermod -aG wheel docker # wheel组就类似于一个管理员的组
# 3.切换到非特权用户
su - docker
id
# uid=1003(docker) gid=1003(docker) 组=1003(docker),10(wheel) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# 4.uid/gid映射
echo "docker:100300:65536" | sudo tee /etc/subuid
echo "docker:100300:65536" | sudo tee /etc/subgid
# 安装docker dockerless,还有其他安装方式,下载RPM安装包,tgz包等
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 配置仓库
curl -fsSL https://get.docker.com -o get-docker.sh
DRY_RUN=1 sh ./get-docker.sh # 查看执行步骤
sudo sh get-docker.sh # 执行安装步骤,安装docker与dockerrootless
# Add user.max_user_namespaces=28633 to /etc/sysctl.conf (or /etc/sysctl.d) and run sudo sysctl --system.
# systemctl --user does not work by default. Run dockerd-rootless.sh directly without systemd.
sudo systemctl start docker # 启动Docker
docker run -d -p 8080:80 nginx # 不需要配置$DOCKER_HOST等环境变量,默认就可以用了。这种真正还是root在跑,具体后面再研究。
# 进程信息 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 遇到其他问题参考官方详细文档

卸载:

1
2
3
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

MySQL

比如用RPM包安装的MySQL,启用的时候也是会用MySQL用户的。其他信息参考MySQL章节

在MySQL启动的时候,单进程mysqld,该进程的就是mysql用户启动的。

这样就保证了mysql服务的独立性,即使mysql服务被黑掉,得到了mysql用户权限,也不会影响整个系统的安全。

mysqld_safe与mysqld区别,直接运行mysqld程序来启动MySQL服务的方法很少见,mysqld_safe脚本会在启动MySQL服务器后继续监控其运行情况,并在其死机时重新启动它。所以mysqld的pid是mysqld_safe。mysqld_safe相当于多了一个守护进程。

用mysqld_safe脚本来启动MySQL服务器的做法在BSD风格的unix系统上很常见,非BSD风格的UNIX系统中的 mysql.server脚本其实也是调用mysqld_safe脚本去启动MySQL服务器的。

1
2
3
4
[root@test lib]# ps -ef|grep mysql
root 3110 1 0 Jul13 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql 3343 3110 0 Jul13 ? 00:09:41 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=

NodeJS

1
2
3
4
5
6
7
8
9
# 新建站号设置密码
useradd nodejs
passwd nodejs
wget https://npm.taobao.org/mirrors/node/latest-v16.x/node-v16.6.1-linux-x64.tar.gz
tar -xvf node-v16.6.1-linux-x64.tar.gz
vi ~/.bash_profile # PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HOME/node-v16.6.1-linux-x64/bin
source ~/.bash_profile
node -v
npm -v

比如安装yapi的时候v16是不行的,改用v13就可以安装并且启动起来。所以可能需要多个版本的NodeJS

MongoDB

方法一:非root用下载tgz包的方式

方法二:rpm包

添加阿里源vi /etc/yum.repos.d/mongodb-org.repo

1
2
3
4
5
6
[mongodb-org-5.0]
name=MongoDB Repository
baseurl=https://mirrors.aliyun.com/mongodb/yum/redhat/7/mongodb-org/5.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc
1
2
sudo yum install -y mongodb-org
sudo systemctl start mongod # 会自动创建mongod用户进行启动程序。
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
[yapi@aiot-host ~]$ cat /usr/lib/systemd/system/mongod.service
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network-online.target
Wants=network-online.target

[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod.conf"
EnvironmentFile=-/etc/sysconfig/mongod
ExecStart=/usr/bin/mongod $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb
ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb
PermissionsStartOnly=true
PIDFile=/var/run/mongodb/mongod.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for mongod as specified in
# https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings

[Install]
WantedBy=multi-user.target

nginx源码安装

1
2
./configure --prefix=/usr/local/nginx # 不需要太多参数配置下面这种并不可取 ./configure  --prefix=/usr/local/nginx  --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log  --http-log-path=/var/log/nginx/access.log  --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock  --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre
make&make install

问题

CentOS7 Error downloading packages 解决办法?

1
2
3
4
5
systemctl restart network
ping www.baidu.com

yum clean cahce
yum makecache

其他问题:重点关注防火墙,网络是否会通

安装nginx

安装nginx如果想用普通用户启动,里面nginx默认是80端口,普通用户不能直接使用80端口,会导致程序启动失败。

参考