Linux ubuntu 优化设置 ¶
注意
适用于 Debian/Ubuntu服务器
在大规模系统上,当然最好是用 Ansible 或 Shipyard 这类工具完全自动化配置。
设置足够复杂的 root 密码 ¶
注意
只有在忘了 sudo 密码时才会用到这个 root 密码。
passwd
更新软件库并升级系统、应用最新的补丁 ¶
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
切换稳定版内核:
sudo apt install linux-image-deepin-stable-amd64 linux-headers-deepin-stable-amd64
添加用户 ¶
注意
永远不要以 root 登录服务器 在用户名方面我们跟 Bryan 遵循类似的惯例,但是你可以根据自己的喜好使用任何惯例。在小团队里,大家共用一个用户名不是问题;但是队伍再大一些的话,最好是给不同的用户设定不同的权限级别,只给精心挑选的少数用户赋予 sudo 权限。
useradd deploy && mkdir /home/deploy && mkdir /home/deploy/.ssh && chmod 700 /home/deploy/.ssh
给用户 deploy 配置喜欢的 shell,这里我们用 bash:
usermod –s /bin/bash deploy
重要
chmod 700 表示“所有者可以读、写、执行”。我们现在还在 root 帐号下,马上就要将此文件夹设为属于 deploy 用户和 deploy组,只有这个用户对 .ssh 文件夹有完全控制权。
使用 ssh key 验证 ¶
我们倾向于避免用密码登录服务器。Bryan 当初那份指南发表后,下面是一些要点:
-
ssh keys 比密码更好,因为它包含并要求更多信息;
-
密码可以被暴力破解,猜测一个公钥基本上不可能,可以认为是完美的安全措施;
-
电脑丢失了怎么办?是的,你的私钥到了别人手里。不过废除 ssh-key 很容易,只需要将公钥从 authorized_keys 里删除。你还应该给你的私钥加上安全的、足够长的密码短语。见下一条;
-
以上这些都好用的前提是:必须用安全的、足够长的密码短语来保护你的私钥。重要的事情至少说两遍。
-
好了,我们把服务器密码验证抛到脑后吧。把你电脑里的 id_rsa.pub 的内容复制到服务器的 authorized keys 文件里。
vim /home/deploy/.ssh/authorized_keys
我们基于 Linux 安全性的“最少特权原则”来设置正确的权限:
chmod 400 /home/deploy/.ssh/authorized_keys && chown deploy:deploy /home/deploy -R
chmod 400 将文件权限设为“仅所有者可读”。第二个命令 chown ,使用户 deploy 和 组 depoly 成为它们家目录的所有者。我们先前提到过这个,记得吗?在设这这个目录权限为“所有者可以读、写、执行”的时候。
我们顺利测试 deploy 用户并设置 sudo 之后,再回来禁止 root 登录和强制实行仅密钥认证。
测试 deploy 用户、设置 sudo ¶
我们来测试一下用 deploy登录,同时不要关闭 root 帐号的 ssh 连接以备万一。如果没有问题,我们就用 root 用户给 deploy 设置密码,因为我们没会禁用密码登录,这个密码是 sudo 的时候用的。还是用一个密码管理器来生成一个复杂随机的密码、加密保存、在团队中共享(同步加密的 pw 文件)。
passwd deploy
设置 sudo 很简单,用这个命令打开 sudo 文件:
visudo
如下,在 root 用户下面添加 %sudo 组(在sudo文件里,用户名没有前缀,组名需要用 %前缀)。确保用 # 注释掉其他任何用户和组,新安装的系统一般不会有,但还是确认一下好。
root ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
然后把 deploy 用户添加到 sudo 组。
usermod -aG sudo deploy
deploy 现在具备了sudo 权限,一般来说你需要退出并重新登录来使用这个权限
强制 ssh 密钥登录 ¶
服务器的 ssh 设置在这里:
vim /etc/ssh/sshd_config
你需要修改或添加下面这几行,我觉得它们相当的简单明了。你可以填上你用来登录的 IP , OpenVPN 搭建的公司 VPN 服务器,带加密验证的,所以为了连接到服务器,你必须首先连上 VPN 。
PermitRootLogin no
PasswordAuthentication no
AllowUsers deploy@你的VPN或固定IP
AddressFamily inet
# 只允许 IPv4
重新启动 ssh 服务来让这些规则生效,
service ssh restart
设置防火墙 ¶
默认情况下 ufw 应该拒绝一切入站连接、允许全部出站连接,但是这行不通(那样的话你怎么连进来呢?)。我们来一步步地显式允许我们视为OK的连接
首先我们需要保证支持 IPV6 ,只需打开配置文件:
vim /etc/default/ufw
允许 IPv6
IPV6=yes
其它要打开的端口我们用 ufw 工具在命令行添加,这非常方便:
# 保证只有从我们的 地址 才能连接 ssh标准端口
sudo ufw allow from ```域名``` to any port 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw disable
sudo ufw enable
以下是一些规则建议 ¶
个人使用 ¶
- 添加 SSH 密钥 - 添加 以下方法 生成的 公钥
- 👻 Gitea 仓库拉取代码,密钥生成 参考文档 https://docs.github.com/cn/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent 建议公钥规则
- 公钥名称为 项目名称 + .pub
- 推荐使用 ed25519 秘钥,禁止1024位以下的 RSA 秘钥
- 首先进入自己的密钥目录 mkdir -p ~/.ssh && cd ~/.ssh
- 生成自己的密钥对,把引号内替换成自己 项目名 ssh-keygen -o -a 100 -t ed25519 -f id_ed25519 -C "gitea.linuxnbg.com"
服务器间 ¶
- Jenkins 与 部署服务器之间 需要密码登录,配置免密
👻 Jenkins 服务器密钥生成、配置 Jenkins 与 部署 服务器间 免密
使用 ssh-keygen 生成 4096 位安全 ssh 密钥,(用于服务器之间的免密登录)
- Jenkins 连接 部署服务器
- ssh-keygen 使用 -b 选项来为 ssh-keygen 指定位大小,使用命令如下: ssh-keygen -b 4096 "jenkins-gitea"
- 如果需要免密 ssh 连接到另一台服务器,使用如下命令: ssh-copy-id -i .ssh/id_rsa.pub 服务器地址
- 将 公钥 添加至 Gitea 设置中,打通 Jenkins 与 Gitea 免密
注意
第一次需要手动 ssh 登录,取消以下提示:
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
隐藏服务器系统信息 ¶
mv /etc/issue /etc/issuebak mv /etc/issue.net /etc/issue.netbak
Ubuntu 20.04 磁盘扩容 ¶
- df -h 查看磁盘信息
- vgdisplay 查看磁盘总量,可分配空间。
- lvextend -L <上面查询到的可分配空间> <查到的> 配置扩容。
lvresize -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv 2> /dev/null
- 重新计算磁盘大小。
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
- df -h 查看磁盘信息。
将 /home 空间、分配给 / ¶
删除 /home 文件系统所在的逻辑卷,增大 / 文件系统所在的逻辑卷,增大 / 文件系统大小
警告
不要在/home目录下执行下面的操作:
终止所有使用 /home 文件系统的进程,卸载 /home , 删除 /home 所在的逻辑卷 lv
fuser -km /home && umount /home && lvremove /dev/mapper/rl-home
扩大根目录所在的逻辑卷, 扩展 XFS 文件系统
lvresize -l +100%FREE /dev/mapper/rl-root && xfs_growfs /dev/mapper/rl-root
重建/home文件系统所需要的逻辑卷:
lvcreate -L 20G -n /dev/mapper/rl-home
创建文件系统:
sudo mkfs.xfs /dev/mapper/rl-home
新建的文件系统挂载到/home目录下:
sudo mount /dev/mapper/rl-home