跳转至

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

以下是一些规则建议

个人使用

服务器间

  • 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 查看磁盘信息

image-20230426193135387

  • vgdisplay 查看磁盘总量,可分配空间。

image-20230426193022885

  • lvextend -L <上面查询到的可分配空间> <查到的> 配置扩容。

lvresize -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv 2> /dev/null

image-20230426193401805

  • 重新计算磁盘大小。

image-20230426193500167

resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

  • df -h 查看磁盘信息。

image-20230426193545923

将 /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