我是从《鸟哥私房菜》这本书开始接触Linux系统的,其中第六章开头的时候有句话一直不能理解:“Linux最优秀的地方之一,就是在于它的多用户、多任务环境”,你再多用户,一次不还是只是一个键盘和鼠标吗?那么多用户又有什么用呢?最近看了一下SSH相关的内容,让我有了新的体会。
- 服务端安装sshd
sudo apt install openssh-server
- 生成密钥
ssh-keygen -t rsa
- 服务端配置
/etc/ssh/sshd_config
客户端配置~/.ssh/config
- 免密登录
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.235.22
- 别名配置
vim ~/.ssh/config
Host ipc
HostName 192.168.1.14
Port 22
User root
Identityfile ~/.ssh/id_rsa
IdentitiesOnly yes
一、SSH是远程Shell
Shell是一个作为用户与Linux系统间的接口程序,它允许用户向操作系统输入需要执行的命令。Linux系统用户根据角色可分为三种:
- root用户:拥有对系统最高管理权限
- 普通用户:只能对自己目录下的文件进行访问和修改,具有登录系统的权限,例如上面提到的www用户、ftp用户等
- 虚拟账户:也叫“伪”用户,这类用户最大的特点是不能登录系统,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。例如系统默认的bin、adm、nobody用户等,一般运行的web服务,默认就是使用的nobody用户,但是nobody用户是不能登录系统的。
用户的配置个人信息一般存放在~/xxx
中,如本次的主角SSH.ssh
相关的配置文件;还有环境变量.bashrc
,git配置文件.gitconfig
和常见的vim配置.vimrc
。修改完之后一般要使用source
或者.
让shell重新读取配置。
对于所有用户的配置一般放在/etc
文件夹中,同样对于SSH服务器而言,其配置放置/etc/ssh/sshd_config
中。了解这些配置是必要的,因为在登陆远程Shell的时候需要对其进行一定的设置。
二、SSH是系统多用户多任务的一种手段
Linux是一个真实的、完整的多用户多任务操作系统,多用户多任务就是可以在系统上建立多个用户,而多个用户可以在同一时间内登录同一个系统执行各自不同的任务,而互不影响,例如某台linux服务器上有4个用户,分别是root、www、ftp和mysql,在同一时间内,root用户可能在查看系统日志,管理维护系统,www用户可能在修改自己的网页程序,ftp用户可能在上传软件到服务器,mysql用户可能在执行自己的SQL查询,每个用户互不干扰,有条不紊的进行着自己的工作,而每个用户之间不能越权访问,比如www用户不能执行mysql用户的SQL查询操作,ftp用户也不能修改www用户的网页程序,因此可知,不同用户具有不同的权限,每个用户是在权限允许的范围内完成不同的任务,linux正是通过这种权限的划分与管理,实现了多用户多任务的运行机制[1]。无论是telnet
还是ssh
都是为了登陆shell以完成对系统的控制,这些工具使用户与物理机空间实现了分离,同时还允许多人同时控制,是一个非常棒的发明。
三、SSH的历史
Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞。通过SSH,可以把所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。目前已经成为Linux系统的标准配置。
SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文主要介绍OpenSSH免费开源实现在Ubuntu中的应用,如果要在Windows中使用SSH,需要使用另一个软件PuTTY[2]。
相对于telnet
,SSH
更加安全,因为其采用了rsa
非对称加密算法,其登陆方法有两种:
- 账号密码型:服务器被冒充,“中间人攻击”
- 密钥文件型:著名开源网站Github就是通过配置公玥的方式完成终端登陆的。
一般而言,一台主机既可以作为SSH服务端亦可作为SSH客户端,客户和服务端都有相应的配置文件,根据需要可以进行文件的配置。客户段在\etc\ssh\ssh_config
服务端在\etc\ssh\sshd_config
,对参数感兴趣的可以点击这里:linux ssh_config和sshd_config配置文件。
四、SSH可以做什么?
目前为止,我用到的有:
- Github远程仓库配置
- Git服务器搭建
- 远程调用GUI界面
了解到SSH还可完成以下的事情:
- 端口转发,感兴趣可以点击这里:彻底搞懂SSH端口转发命令
- 拷贝文件
五、SSH配置(ubuntu为例)
ubuntu默认已经安装了ssh客户端,服务端支持需要下载openssh-server:
sudo apt install openssh-server
这里顺带提一下Linux是如何管理一个服务的,ubuntu目前已经使用systemctl完成对服务的启停重启状态查询。
- systemctl命令:是一个systemd工具,主要负责控制systemd系统和服务管理器。
- service命令:可以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。
- chkconfig命令:是管理系统服务(service)的命令行工具。所谓系统服务(service),就是随系统启动而启动,随系统关闭而关闭的程序。
查看sshd是否开启:
systemctl status sshd
如配置SSH服务器允许root登陆
vim /etc/ssh/sshd_config
修改PermitRootLogin
为yes
,使用systemctl工具完成服务的重启。
systemctl restart sshd
或者使用service
service sshd restart
六、SSH登陆
最简单的方法是通过账号密码登陆:
ssh root@ip
按照提示输入密码即可登陆,像是阿里云服务器也可以用这个方法登陆。这样容易遭受中间人攻击,使用密钥的方法可以避免这种攻击:
在~/.ssh中生成公私钥id_rsa
id_rsa.pub
:
ssh-keygen -t rsa # 使用ssh-keygen生成type为rsa的密钥
客户端中的id _rsa
需要复制到服务端,以完成身份的自动验证,使用指令ssh-copy-id
的 -i(identity_file)
选项 指定一个 完成免密且安全登陆:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.235.22 #等效于将id_rsa内容追加到~/.ssh/authorized_keys 中
PS: id_rsa
中rsa是一种加密算法,传到服务器的叫做公钥id_rsa.pub
,私钥则是id_rsa
。
为了简化记忆,ssh别名可以帮助到你:
vim ~/.ssh/config
Host ipc
HostName 192.168.1.14
Port 22
User root
Identityfile ~/.ssh/id_rsa
IdentitiesOnly yes
使用方法如下:
ssh ipc
挂载本地文件夹挂载到远端:
mount -t nfs 192.168.1.13:/home/ubuntu/work /mnt
[1] 操作系统-多用户如何理解(Linux)
[2] SSH简介及两种远程登录的方法
[3] SSH 三步解决免密登录