sftp-i参数,sftp配置文件详解
SSH权限详解
原文链接
之前两篇文章 利用SSH代理访问内网资源 和 使用SSH代理在本地开发环境调试各种回调 两篇文章,介绍了ssh的各种代理姿势,SSH的功能确实强悍。如果用过ssh代理功能,就有人要问了,我能否限制用户只允许使用代理功能,而不允许用户登录到我的系统中呢?
当然可以!否则又怎么会称为SSH(注:SSH是Secure Shell的缩写)呢?连权限都不能保障怎么敢叫 Secure 呢?本篇文章就来详解下SSH的花式权限,来点不一样的干货。
先谈谈SSH有哪些功能,才能谈到每个功能有哪些权限。SSH最常见的有三大功能:
其次是SSH是一个典型的C/S应用,服务端运行 sshd 守护进程,监听 TCP/22 端口(默认情况下),客户端运行 ssh 程序,远程连接 sshd 应用,使用以上三种功能。
sshd 使用 /etc/ssh/sshd_config 和 ~/.ssh/authorized_keys (这个文件仅用于做密钥认证的配置,如果和sshd_config配置冲突则此文件配置生效。此配置文件可以实现细化到密钥的权限,gitlab使用此配置实现用户的ssh访问控制)配置文件做服务配置, ssh 客户端使用 /etc/ssh/ssh_config (全局配置)和 ~/.ssh/config (个性配置)两个配置文件(windows 10的openssh使用 %USERPROFILE%\.ssh\config )。默认配置文件几乎不用动,ssh就帮我们做好了开箱即用的配置。本文不会讲解ssh每个配置项的含义,只会根据一些场景讲解对应的权限控制,所有场景都是以默认配置为基准,讲解一些常用的配置,一些不常用的配置项就不提及了。
下面我们将详解每个功能的权限
最基本的使用方式,直接远程连接到服务器的shell上,实现远程控制的需求。
只要用户满足以下条件之一,ssh便会拒绝登录:
所以通常创建一个低权限账户,只负责运行本地服务的,使用的useradd命令大致如下:
新用户无密码,并且不是一个合法的shell,所以根本没法登录
如果连motd信息都不想让用户看到,可以直接创建一个 ~/.hushlogin 空文件即可。如果想通过修改配置文件,那么需要同时修改 /etc/sshd_config ( PrintMotd no )和 /etc/pam.d/sshd (去掉 pam_motd.so 加载),比较麻烦。
设置 PermitRootLogin 选项即可。 no 表示彻底拒绝root远程登录,想要切换成root就只能通过普通用户的 su - 或 sudo -i 切换root身份了。 prohibit-password 和 without-password (Ubuntu 14.04以后默认)表示拒绝密码登录,表示只能通过密钥登录了。 forced-commands-only 选项表示只允许密钥认证,但是必须给定 command ,也就是非交互式执行ssh。
这个其实办法很多,比如在防火墙控制,在 /etc/hosts.(deny|allow) 控制等,其实在 /etc/sshd_config 也可以控制,方法就是使用 Match address ,比如:
用sshd配置本身做ip白名单的比较少,但是 Match 配置却是一个非常有用的配置项,它可以实现我们对用户或用户组区别对待,这个我们会在后面再细说。
有关代理的使用可以参考我之前写的 利用SSH代理访问内网资源 和 使用SSH代理在本地开发环境调试各种回调 两篇文章。
x11转发功能实际应用会非常罕见,作用是将远程的图形数据在本地的X server上展示,以实现本地操作远程图形程序的功能。首先是Linux服务器大多运行在无图形环境下,本身就没有图形化程序跑在上面,再加上客户机可能多数是windows,又没有X环境,更加限制了这个功能的使用。还有就是x11 forwarding性能不是很好,实际使用会发现非常卡,不适合使用那种对响应速度要求比较灵敏的应用程序,比如浏览器,在x11 forwarding下运行动图会非常卡。最后就是需要跑图形化程序的服务器多数都安装有桌面环境,配置有vnc,因此就更没有人愿意使用这个功能了。
如果不希望所有端口都能用于转发请求,可以配置 PermitOpen 参数:
如果允许多个端口用于转发,那么必须一个个配置出来, any (默认)表示所有端口都允许用于转发。
这个比较繁琐,因为目前常见的通过ssh传输文件的有三个命令 scp , rsync , sftp 。它们的机制不一样,其中 scp 和 rsync 是通过远程非交互式执行命令实现的,而 sftp 是通过openssh的sftp server实现的。
对于 scp 和 rsync ,只需要限制非交互式命令就可以了,比如
或在 ~/.ssh/authorized_keys 对应的rsa public key 前面加上 command="/bin/bash" (参考gitlab的 /var/opt/gitlab/.ssh/authorized_keys ),效果是等效的。这样就可以实现允许用户远程登录系统,但是 scp 和 rsync 命令失效,同时由于限定死了command参数,导致你的非交互式ssh命令也无法使用了,比如 ssh user@ip ls / 这一类非交互式ssh不起作用了。
但是对于 sftp 的限制则要容易的多,因为 sftp 权限是单独分开的,不和ssh命令执行权限混在一起,并且sftp也和ftp一样,有自带的一些命令实现(比如ls, cd, get, put等等),如果设置
或等效的 ~/.ssh/authorized_keys 配置,则表示只允许使用sftp,不允许shell登录。如果配置中去掉 Subsystem sftp /usr/lib/openssh/sftp-server 这一行就可以关闭sftp服务
经常时候我们需要混合以上各种权限使用。比如某些用户我们开放出来,但是限制它的功能,此时 Match 配置就是我们的好朋友了。
由于用户不能登录shell,不能使用密码认证,因此想要使用代理,必须使用类似于下面的命令:
使用 -i 参数指定私钥文件用于公钥认证,使用 -N 参数表示不执行远程命令,仅仅使用port forwarding。
这里我们Match了 sftp-only 这个组,在这个组下面的用户都使用下面的配置。使用了ForceCommand,因此不能登录shell,使用了 ChrootDirectory 限制了用户的根目录,关闭了各种转发功能。
通过 Match 的组合,我们可以很方便的限制一些特定用户的权限,这样就实现了ssh用户的一些特殊化管理。
这里只是按照一些可能遇到的场景讲解了下 sshd_config 的配置,对于等效的 ~/.ssh/authorized_keys 配置同样适用。其实ssh还有很多强大的功能,但是用的可能比较少,这里就不详细讲解那些不太常见的参数了,有兴趣的读者可以自行查阅man手册获取更多资料:
SFTP的问题
FTP出现“数据 Socket 错误: 连接被拒”解决办法
通过FTP连接网站时出现“数据 Socket 错误: 连接被拒 列表错误”,如下图:( `: f) Q, L, U: `" g; L3 C( p' N
DD.gif (5.65 KB)
2007-8-27 02:52# |, n8 l" S4 }2 h3 V
出现这个错误的原因一般如下:
. E% M6 j# ?* Y8 [1, 关闭被动模式;( {, H; o1 z" Q* R/ ]7 ~9 n
2, 传输类型:二进制;
1 l5 C, \ Y( D+ G: a
! C2 Y- d# `/ {; e* I3, 关闭防火墙.7 O6 D4 S, I' r6 `! U
4, 关闭杀毒软件., y9 ~0 |) f* H+ v
5, 关闭正在下载的程序,如:迅雷,BT,P2P软件等.就是关闭一些占网速与电脑资源的程序." q# Y9 s1 y: w
8 Y7 s1 H) x' z N现整理解决方法如下:: e" y* a, Q! ~- x ~' n% u* w
1)工具:CutFTP32,在如下的菜单目录中设置:
9 b% r2 G; \# N2 e4 Q9 s i编辑--设置--连接--防火墙--页面中的“PASV模式”,只要将前面的钩去掉就可以了。
8 [) M, V0 L5 a9 ]0 a
7 h% | f4 D2 H" b$ Z) B- x- i2)工具:FlashFXP3.1.14,在如下的菜单目录中设置:* m( |7 {1 c+ d5 u1 N
选项--参数设置--连接--页面中的“使用被动模式”,只要将前面的钩去掉就可以了。
2 \5 _7 s3 L- @: _: B `: h3 r* s2 u: J* U
, Q2 S% _" _/ m经常登录各种FTP服务器,会遇到socket错误,朋友也经常遇到,来问我。偏偏大家使用的是不同的FTP软件,所以,今天我把几种目前常用FTP软件的解决办法告诉大家。
: D( P$ i5 S) T c( J( ` 8 f- e: o$ [8 k" k* B( h: z
★Cute FTP 3.5英文版:FTP—Settings—Options—Firewall,将“PASV mode”前复选框中的打勾去掉。 6 e0 M9 A/ B" B5 U
3 s' }$ |, _$ O ^ E
★Cute FTP3.5中文版:FTP—设置—选项—防火墙,“PASV方式(A)”前复选框中的打勾去掉。
2 |+ P+ O6 Z8 L+ A5 [( A0 }$ R. f
★Cute FTP4.0中文版:右击你所建立的ftp站点—选择属性(properties)—去掉"use PASV mod" 选择项7 f* l$ @5 n" ?7 _* W) p w
2 f( P3 ~0 \. q2 R i [
★Cute FTP Pro2.0中文版:编辑—全局设置—连接—连接类型,“PASV/PORT”下拉选项菜单选择PORT。 2 ^% y4 F4 _4 M" P8 k6 {; w1 E M
+ L: U, k% f! B2 O# ~6 l7 u+ ~
★Leap FTP2.7.2:Sites—Site Manager—Advanced,将“Use PASV mode”前复选框中的打勾去掉。9 E5 a! E* d. P% k* f8 A
2 O" M* i E2 }" Y- ?
★flashfxp : 选项-参数-代理-去掉“使用被动模式”
% U/ R; A4 R/ p$ i
5 d9 U! g: z' x★FlashFXP软件关闭被动模式的方法:# J! @, K, x9 ?8 V
顶部工具栏--选项--参数设置--连接--使用被动模式勾去掉-OK.
3 W V$ ^; g/ h. z j) U
h( f- N( ]5 w# X0 ^) I+ l★flashget : 选项-参数-代理服务器-编辑-将“Use PASV mode”前复选框中的打勾去掉。
3 }$ c; U% s( s! Q$ Z4 O: D* f0 a9 F) r6 O. x) ^
8 m! d. z/ M: v: g% I一般出现此类问题的原因是客户端网络出口与服务器端防火墙的端口设置冲突造成的。2 H1 u9 Z ~8 i: j
所以对于其他软件只要不选择PASV为连接类型,一般都可以解决这类问题了。
}, a, ]3 \9 p) L" Q, L
0 H- h; n+ S g. m还有一种情况:
5 x/ `* T2 k2 ?' W. p1 p虽然FTP使用的是TCP端口21(ftp-control)。2 }5 K- Z9 G) o0 O
但它还使用了TCP端口20(ftp-data)。
+ R) x) g2 { @ ?, z ]) ~- a, A/ @端口21用来传输FTP命令控制。) m4 x7 w' K% k6 x8 B
端口20用来传输数据。, u2 j3 Y* x8 x0 f; h
6 s5 y- v, f' x' j% I) n! n如果你FTP无法连接,请检查20、21端口打开没有!一般用PORT数据连接类型.* E; q) V6 M% E- [, Q; d" B
$ f1 p" C o7 O" S1 E
如果你改变了默认端口21,有时就会出现接受来自服务器的数据连接时发生超时(30000 毫秒).7 z v1 e, v3 ?
最好是用FTP默认端口21。+ J9 @5 K2 m/ j L8 T9 h6 b
/ u) L- T7 {; E, b
还有一种解决方法:6 l- v( G: U5 z( a, @
i# y! I. x" S Q E1, 关闭被动模式;/ B' Q% I s8 C+ ]6 H
2, 传输类型:二进制;- b9 b4 d1 Z" \7 V6 J
! i6 m. u6 W! [+ N- r8 H4 C J
3, 关闭防火墙.
3 {/ G3 l: c( f* N# Z4, 关闭杀毒软件.. B" R, B* V' l C8 d# F# b1 c
5, 关闭正在下载的程序,如:迅雷,BT,P2P软件等.就是关闭一些占网速与电脑资源的程序.
8 B; a2 I ?( m1 N
6 }! E8 k$ L5 s7 GFlashFXP软件关闭被动模式的方法:
8 l+ A( U* ~ `1 S) M顶部工具栏--选项--参数设置--连接--使用被动模式勾去掉-OK
linux的sftp命令
linux下sftp命令很多人都只是了解了语法却不知道具体用法,下面由我为大家整理了linux下sftp命令的相关知识,希望对大家有帮助!
linux的sftp命令
1.常用登陆方式:
格式:sftp 《user》@《host》
通过sftp连接《host》,端口为默认的22,指定用户《user》。
2.查看sftp支持的命令
使用help命令,查看支持的命令,如:
sftp》help
(其中命令前面有“l”表示本地执行,其他表示在所登录的远程主机上面执行)
3.基本的使用
sftp主要是用来传输文件的,包括上传文件(从本机到远程主机) ,下载文件(从远程主机到本机)。
(1)文件下载
get [-Ppr] remote [local]
如:get test.cpp 。/Project/
将远程当前目录下的文件test.cpp下载到本地当前目录的Project文件夹中。
(2)文件上传
put [-Ppr] local [remote]
如:put /home/liu/Software/RHEL_5.5\ x86_64.iso /home/xudong/Blog/
将本地/home/liu/Software/目录下的ios文件传送到远程登陆主机的/home/xudong/Blog/目录下。
(3)其他命令
可以使用命令还是有几个的,如ls、lls;cd、lcd;pwd、lpwd等。具体查看help输出吧。
sftp就是secure file transfer program,它基于ssh,用它在两个Linux系统间传递文档非常方便。
要使用sftp传递文档,首先应该在服务器端打开ssh服务,如果没有打开,一般可以通过下面的命令打开:
# /etc/init.d/sshd start
然后就可以在客户端通过sftp登录服务器端进行文档传递操作,如下:
$ sftp [-oPort=port_number] username@server_ip[:file1 file2 。。。]
补充:Linux的sftp命令的参数说明
-o 用来向ssh传递参数,比如-oPort=222,会告诉ssh使用连接服务器的222端口,而不是默认的22端口。这个在遇到服务器端把ssh服务默认的22号端口改变的情况时会有用。
后面的file1、file2代表文件名,也可以是一个目录。在没有指定文件时会打开一个交互界面,在交互界面下可以通过命令来传递文档。
如:
$ sftp -o port = 222 user@
Linux的sftp命令的命令说明
在sftp命令的交互界面下,有很多命令可以用,比如:cd、ls、pwd、bye、chmod、chgrp、chown、df、get、help、mkdir等等。当然这些命令都是针对服务器端的操作,其中一些命令在加l前缀的情况下可以实现在本地下的操作。比如,lpwd命令会打印本地当前工作目录(即连接sftp前的当前工作目录)。这些命令中有两个是用来交换文档的,它们是get和put命令,如下:
》 put local_path [remote_path]
》 get remote_path [lcoal_path]
put 命令会把本地文件或目录“推”到服务器端;get命令则把服务器端文件或目录“拉”下来。
上面就是Linux使用sftp命令传输文件相关介绍了,相较于ftp而已,sftp命令传输文件更加安全,推荐使用sftp命令传文件。