Environment
Item | Description |
---|---|
OS | Ubuntu 22.04.3 LTS |
kernel | 5.15.0-91-generic |
SSH
延长 ssh 超时时间
编辑 /etc/ssh/sshd_config
,加入如下两行:
ClientAliveInterval 540 # 消息的时间间隔,单位是秒
ClientAliveCountMax 10 # 如果发现客户端没有相应,则判断一次超时,这个参数设置允许超时的次数。
设置通过密钥登陆
切换到需要使用密钥登陆的账户,输入命令:
ssh-keygen # 生成秘钥,默认位置在 /home/{user}/.ssh/ 目录下,其中 id_rsa 为私钥,id_rsa.pub 为公钥。
cd ~/.ssh
cat id_rsa.pub >> authorized_keys # 安装公钥
chmod 600 authorized_keys # 设置文件权限
chmod 700 ~/.ssh # 一般不用设置,就是700
配置 ssh 服务
sudo vim /etc/ssh/sshd_config # 编辑 /etc/ssh/sshd_config 文件
# 将如下两行的 no 改成 yes
RSAAuthentication yes
PubkeyAuthentication yes
# 注意如下两个的设置
PermitRootLogin yes # 是否允许 root 用户登录
PasswordAuthentication no # 禁用密码登录
# 重启 ssh 服务
service sshd restart
下载私钥 id_rsa 到本地。
在 ~/.ssh 目录下创建 config 文件,并进行如下配置
Host abc
HostName 192.168.31.1
User timer
Port 5320
IdentityFile ~\.ssh\def
使用如下命令连接服务器:ssh abc
Google Authenticator 两步验证
-
安装 Google Authenticator
$ sudo apt install libpam-google-authenticator
-
安装完成之后修改文件
/etc/pam.d/sshd
,在此文件末尾添加auth required pam_google_authenticator.so
如果你希望没有开启两部验证的账号还可以登录,则在此文件后面添加
auth required pam_google_authenticator.so nullok
-
修改 ssh 配置文件
/etc/ssh/sshd
# 修改这一行: ChallengeResponseAuthentication no # 为: ChallengeResponseAuthentication yes
-
重启 sshd 服务
sudo systemctl restart sshd.service
-
接下来我们就可以通过
$ google-authenticator
来生成一个二维码和密匙,全部选择:yes。
用户与权限
创建与查看用户、修改密码、指定主目录与 shell
创建用户有两种方式:(adduser、useradd)
- adduser:默认情况下
adduser
在创建用户时会主动调用/etc/adduser.conf
;在创建用户主目录时默认在/home
下,而且创建为/home/用户名
。为用户指定 shell 版本为:/bin/bash
。常用参数如下:- -home: 指定创建主目录的路径,默认是在
/home
目录下创建用户名同名的目录,这里可以指定;如果主目录同名目录存在,则不再创建,仅在登录时进入主目录。 - -conf: 在创建用户时使用指定的 configuration 文件。
- -force-badname: 默认在创建用户时会进行
/etc/adduser.conf
中的正则表达式检查用户名是否合法,如果想使用弱检查,则使用这个选项,如果不想检查,可以将/etc/adduser.conf
中相关选项屏蔽。
- -home: 指定创建主目录的路径,默认是在
- useradd:需要使用参数选项指定主目录、系统shell版本、密码等,如果不使用任何参数,则创建的用户无密码、无主目录、没有指定shell版本。常用参数如下:
- -d: 指定用户的主目录
- -m: 如果存在不再创建,但是此目录并不属于新创建用户;如果主目录不存在,则强制创建;-m 和 -d 一块使用。
- -s: 指定用户登录时的 shell 版本
- -M: 不创建主目录
################## adduser 命令创建用户 ##################
# 使用 adduser 创建用户
$ adduser vincen
################## useradd 命令创建用户 ##################
# 使用 useradd 创建用户
$ useradd -d "/home/vincen" -m -s "/bin/bash" vincen
# 为用户指定用户主目录
$ usermod -d /home/vincen vincen
# 为用户指定命令解释程序
$ usermod -s /bin/bash vincen
# 修改用户密码
$ passwd vincen
# 查看系统有哪些用户
$ cat /etc/passwd
删除用户
################## deluser 命令删除用户 ##################
# 只删除用户
$ sudo deluser vincen
# 连同用户的主目录和邮箱一起删除
$ sudo deluser --remove-home vincen
#连同用户拥有的所有文件删除
$ sudo deluser --remove-all-files vincen
################## userdel 命令删除用户 ##################
# 只删除用户
$ sudo userdel vincen
# 连同用户主目录一起删除
$ sudo derlser -r vincen
赋予用户 root 权限
赋予用户 root
权限,即用户可以使用 sudo
命令。sudo
命令的执行流程是:当前用户转换到 root
, 然后以 root
身份执行命令,执行完成后,直接退回到当前用户。
- 先给 sudoers 文件添加修改的权限,
chmod u+w /etc/sudoers
。 - 编辑 sudoers 文件,在
root ALL=(ALL) ALL
下面,添加username ALL=(ALL) ALL
。
/etc/sudoers 文件的格式
通过 cat /etc/sudoers
指令来查看该文件,会看到如下几行代码:
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
对 /etc/sudoers
文件进行编辑的代码公式可以概括为:
# 凡是 [ ] 中的内容, 都能省略,命令和命令之间用 , 号分隔。
授权用户/组 主机=[(切换到哪些用户:组)] [是否需要输入密码验证] 命令1,命令2,...
字段1 字段2=[(字段3)] [字段4] 字段5
说明:
-
字段1
不以%
开头的表示“将要授权的用户”,比如例子中的root
。以%
开头的表示“将要授权的组”,比如例子中的%admin
和%sudo
。 -
字段2
表示允许登录的主机,ALL 表示所有。如果该字段不为 ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo
命令。比如:jack mycomputer=/usr/sbin/reboot,/usr/sbin/shutdown
表示:普通用户 jack 在主机 mycomputer 上,可以通过 sudo 执行 reboot 和 shutdown 两个命令。
-
字段3
如果省略,表示切换到 root 用户,如果为ALL,表示能够切换到任何用户。例子中的(ALL:ALL)
是允许任何(用户:组)
的意思。请注意,字段3
如果没省略,必须使用( )
双括号包含起来。 -
字段4
的可能取值是NOPASSWD:
。请注意有双引号。表示执行 sudo 时可以不需要输入密码。比如:lucy ALL=(ALL) NOPASSWD: /bin/chown,/usr/sbin/useradd
表示: 用户 lucy 在任何主机上,通过 sudo 命令执行 /bin/chown,并且不需要输入密码。但运行 /usr/sbin/useradd 命令时需要密码。
这是因为
NOPASSWD:
只影响了其后的第一个命令。 -
字段5
是使用逗号分开一系列命令,这些命令就是授权给用户的操作,ALL 表示允许所有操作。-
命令都是使用绝对路径。这是为了避免目录下有同名命令被执行,从而造成安全隐患。
# 错误示例 lucy ALL=(ALL) chown,chmod,useradd
如上,那么用户就有可能创建一个他自己的脚本,也命名为 userad,然后放在它的本地路径中,如此一来他就能够使用 root 来执行这个名为 “useradd” 的本地脚本。这是相当危险的!
-
通配符和取消命令。
# 用户 papi 能够运行所有程序,但是不能运行 passwd。 # 注意:一旦赋权 passwd,用户可以修改 root 密码。 papi ALL=ALL,!/usr/bin/passwd # 用户 jack 能够运行所有程序,也能修改所有人的密码,但是不能修改 root 账户的密码。 jack ALL=ALL,!/usr/bin/passwd root # 用户 lucy 能够运行目录 /usr/sbin 和 /sbin 下所有的程序,但 fdisk 除外。 lucy ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk
-
其他
- 在具有 sudo 操作的用户下, 执行
sudo -l
可以查看到该用户允许和禁止运行的命令。 sudo -u 用户名 command
允许使用特定用户来执行后面 command,只是大多数时候都是以 root 身份来执行,所以使用sudo command
即可,省略 -u 选项。
推荐做法
不是直接修改 /etc/sudoers
文件,而是将修改写在 /etc/sudoers.d/
目录下的文件中。
任何在 /etc/sudoers.d/
目录下,不以 ~
结尾的文件和不包含 .
的文件,都会被解析成 /etc/sudoers
的内容。
如果使用这种方式修改 sudoers,需要在 /etc/sudoers
文件的最后行,加上如下语句(默认已有):
#includedir /etc/sudoers.d
注意,这里的指令 #includedir
是一个整体,前面的 #
不能丢,也不能在 #
后有空格。
并且,尽可能使用 visudo
来编辑 sudoers,因为有相关的错误识别机制。
apt
# 更新源
$ sudo apt update
# 查看可以更新的软件包
$ sudo apt list --upgradable
# 更新软件包
$ sudo apt upgrade
# 搜索软件包
$ apt search 包名
# 安装软件包
$ sudo apt install 包名
系统信息
版本信息
# Linux 内核版本
$ uname -a
# Linux 内核版本,gcc 版本,和发行版版本
$ cat /proc/version
# 发行版版本,代号
$ lsb_release -a
# 发行版版本
$ cat /etc/issue
修改主机名
主机名存放在 /etc/hostname 文件中,在文件中输入新的主机名并保存该文件即可。重启系统后生效。