目录
前言:Centos7中默认已经安装了sshd服务(sftp),但是如果以CentOS为基础镜像时,sftp服务可能是不存在的,所以需要安装ssh。
一.安装ssh
开启ssh服务需要root权限,先用root账户登陆。在centos7中ssh服务默认是已经被安装了的。通过命令rpm -qa | grep openssh
查看是否安装了ssh服务
显示上面三个,说明存在,则可以跳过本步骤。
如果不存在或者不全,安装 : yum install openssh-server
安装好后在ssh配置文件里进行配置 :vi /etc/ssh/sshd_config
然后
esc+:wq
保存退出。
修改完后用/bin/systemctl start sshd.service
开启ssh服务,这个命令没有回显
开启后用ps -e | grep sshd
检查一下ssh服务是否开启
再用netstat -an | grep 22
检查一下22端口是否开启
将ssh服务添加到自启动列表中:systemctl enable sshd.service
二.安装ftp
1、安装并启动FTP服务
1.1 安装vsftpd
使用 yum 安装 vsftpd
yum install -y vsftpd
1.2 启动vsftpd
安装完成后, 启动vsftpd服务 :
service vsftpd start
启动后, 可以看到系统已经监听了 21 端口(Ubuntu下命令为: lsof -i:21)
netstat -nltp | grep 21
此时, 访问ftp://IPaddr 就可浏览主机上的 /var/ftp目录了
2、配置 FTP 权限
2.1 了解 vsftpd 配置
vsftpd 的配置目录为 /etc/vsftpd, 包含下列的配置文件 :
a. vsftpd.conf 为主要配置文件
b. ftpusers 配置禁止访问 FTP 服务器的用户列表
c. user_list 配置用户访问控制
2.2 阻止匿名访问和切换根目录
匿名访问和切换目录都会给服务器带来安全风险, 我们把这两个功能关闭.
编辑 /etc/vsftpd/vsftpd.conf, 找到下面两处配置并修改:
禁用匿名用户 YES 改为NO
anonymous_enable=NO
禁止切换根目录 删除或#
chroot_local_user=YES
编辑完成后保存配置, 重新启动 FTP 服务
service vsftpd restart
2.3 创建 FTP 用户
创建一个用户 ftpuser
useradd ftpuser
为用户 ftpuser 设置密码
passwd ftpuser 或 echo “new_password” | passwd ftpuser --stdin
2.4 限制该用户仅能通过FTP访问
限制用户 ftpuser 只能通过 FTP 访问服务器, 而不能直接登录服务器
usermod -s /sbin/nologin ftpuser
2.5 为用户分配主目录
为用户 ftpuser创建主目录并约定
/data/ftp:为主目录, 该目录不可上传文件
/data/ftp/pub:文件只能上传到该目录下
在/data中创建相关的目录 mkdir -p /data/ftp/pub
设置访问权限 chmod a-w /data/ftp && chmod 777 -R /data/ftp/pub
设置为用户的主目录 usermod -d /data/ftp ftpuser
3、OK
至此, FTP服务已经搭建完成, 可以使用各种第三方客户端来测试访问FTP服务器 访问前, 记得关闭防火墙 service
firewalld stop 如果需要使用root登录连接FTP服务, 需要配置 /etc/vsftpd/user_list 和
/etc/vsftpd/ftpusers, 将文件中的root注释
三.配置SFTP
SFTP通过SSH在计算机之前建立安全的链接用作文件传输;通过SFTP可以很方便的将文件传输到你的服务器。
本文将在CentOS 7上通过OPENSSH配置SFTP服务。
1、创建用户组 sftp
groupadd sftp
2、创建用户 agree
useradd -g sftp -s /sbin/nologin -M agree
-g 指定用户所属组,必须已经存在,
-s /sbin/nogin 禁止ssh登录
-M 不要自动创建用户的宿主目录
agree添加的用户名
3、创建密码
passwd agree
4、 创建目录,-d 创建多级目录
mkdir -p /sftp
5、 修改用户宿主目录 ,指定/sftp登录默认目录
usermod -d /sftp agree (docker中可以修改为/aase,不修改的话,也不影响下面的上传目录)
6、修改配置文件 sshd_config
vi /etc/ssh/sshd_config
将下面这行注释
Subsystem sftp /usr/libexec/openssh/sftp-server
然后在末行加入:
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /sftp (对应docker容器目录为/aase)
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
说明:
Match Group sftp 匹配sftp用户组中的用户
ChrootDirectory %h 只能访问默认的用户目录(自己的目录),本文采用的自定义的目录
7、设置目录权限
chown root:sftp /sftp (我的docker容器服务目录为aase)
chmod 755 /sftp
8、上传目录
设置用户可以上传的目录, 该用户下允许用户上传删除修改文件及文件夹
mkdir -p /sftp/upload (对应docker容器目录为/aase/workspace)
chown agree:sftp /sftp/upload (对应docker容器目录为/aase/workspace)
chmod 755 /sftp/upload(对应docker容器目录为/aase/workspace)
9、启动sshd.service
systemctl start sshd.service
10、测试
sftp agree@127.0.0.1
11、解决报错问题
1.出现Received message too long 1416128883
这个错误,网上好多说是把.bash_profile .vimrc .gnomerc 这三个文件里的cat 、echo去掉,可是我的电脑里这三个文件根本不存在,创建用户时不是/bin/bash,感觉不是这个的问题。水平有限,未能根本解决。可以修改他的限制。
把test用户的 /sbin/nologing改为/bin/bash
usermod -s /bin/bash test
2.如果出现安全类的问题
建议修改 /etc/selinux/config 中SELINUX 为 disabled,
然后把防火墙关闭
重启后生效
开启: chkconfig iptables on
关闭: chkconfig iptables off即时生效,重启后失效
开启: service iptables start
关闭: service iptables stop
12、使用私钥登录
1、生成秘钥
ssh-keygen -t rsa
输入ssh-keygen -t rsa表示生成RSA密码,可以存放位置,如果不输入位置,使用默认值,home下的本用户名下的.ssh下,中间出现要求输入密码的,可以输入,也可以不输入,如果输入则要记住该密码。
2、修改openssh服务器端配置
在安装位置的etc目录下找到文件sshd_config,例如我的文件位置在/etc/sshd_config,修改以下两项
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
第一个参数用于说明公钥文件位置,第二个是强制使用密钥访问,而不是用户名及密码,当然第二个参数可以保持yes,这样可以有两种方式访问。
3、重启openss
net stop opensshd
net start opensshd
这样在/home/username/.ssh/下生成两个文件id_rsa及id_rsa.pub,其中id_rsa是私钥,id_rsa.pub是公钥,私钥是客户端用的,公钥该名称id_rsa.pub为authorized_keys
4、登录
如果sftp在docker容器内,则需要把生成的私钥复制出来
docker cp 容器id :容器内私钥路径 宿主机路径
sftp -oIdentityFile=私钥地址 -oPort=端口 用户名@ip #此时的私钥地址就是宿主机路径
样例 sftp -oIdentityFile=/tmp/.ssh/id_rsa -oPort=23 agree@192.168.57.10
四.docker
1.Failed to get D-Bus connection: Operation not permitted
1.1 docker容器配置ssh时可能会遇到:Failed to get D-Bus connection: Operation not permitted
容器启动时用如下命令:docker run --privileged -itd 容器名称 /usr/sbin/init,然后执行docker exec -it 容器id /bin/bash
1.2 以包含ftp/sftp的镜像为基础镜像时
dockerfile最后添加 & /usr/sbin/sshd -D
例如: CMD sh startup.sh
& /usr/sbin/sshd -D