如何在需要sudo进行根访问和基于ssh密钥的身份验证的系统上使用SFTP?


26

我希望能够使用SFTP编辑需要root权限的文件。

我正在使用基于SSH密钥的身份验证-智能卡上的rsa密钥。

如果系统需要sudo来执行根级命令,该如何解决?

我可以创建仅绕过SFTP的sudo的方法吗?

有没有办法保持sudo和密钥身份验证。

我正在使用Windows连接到Ubuntu。我需要它来与Mac和Ubuntu一起使用。

我了解如何执行SSH隧道管理系统服务。目前,我直接使用root用户登录,但是密码登录已禁用。我不明白如何同时使用sudo和SFTP。最好的做法是要求以非root用户身份登录,然后要求使用sudo,因为日志将记录为每个命令授予谁升级特权。

使用基于密钥的身份验证时,我应该对此加以关注吗?或者这在安全性/日志记录方面是微不足道的?似乎基于密钥的身份验证在日志中记录了用户的序列号,并且您可以有多个密钥供root用户标识每个用户。对我来说,这似乎与使用sudo效果相同。我错了吗?


2
我只是直接将root帐户用于基于密钥的身份验证,然后跳过sudo
Martin von Wittich 2014年

1
“似乎最好的方法是要求以非root用户身份登录,然后要求使用sudo,因为日志将记录为每个命令赋予谁升级权限的人。” -但这不值多少,因为获得root特权的人仍然可以篡改日志。
Martin von Wittich 2014年

多少个文件?
尼尔斯2014年

1
只是要注意,下面是sftp -s“ sudo / usr / lib / openssh / sftp-server” targethost.fqdn的一个正确答案。如果sudo需要密码,则可以将这一特定命令列入nopasswd的白名单。
Mikko Ohtamaa 2015年

Answers:


7

SFTP是对文件操作的命令访问,具有您所使用帐户的限制。您必须使用ssh进行更多管理操作,从而无法同时使用sudo和SFTP。如果需要使用SFTP不受限制地访问整个磁盘,请使用root帐户进行操作。无论如何,您当然可以使用两个不同的会话同时在sftp和ssh上用root登录。

安全密钥提高了安全性,并使记录更加容易,不需要键盘输入。仅有助于登录,您可以为每个帐户用户使用多个密码,并且效果相同。

编辑:我忘记了:如果您将用户ID分配为0,但您可以创建另一个帐户,其效果与root相同,但没有任何意义,以同样的方式很危险。如果有人尝试像root一样登录,可能会产生一些混淆,但是除此之外,没有太多意义。


12

用sudo调用子系统对我有用。

以Ubuntu主机为例:

sftp -s "sudo /usr/lib/openssh/sftp-server" targethost.fqdn

2
仅当您不需要密码来对它进行sudo时,或者如果您已经有sudo票证并且已禁用tty_tickets时,这才起作用。在大多数现代安装中,默认设置都不是。
猎豹

这是连接到默认Amazon Linux系统的理想选择,您以用户ec2-user的身份进行连接,并且无需密码即可使用sudo。+1,谢谢!(请注意,在Amazon Linux上,该命令略有不同:sudo /usr/libexec/openssh/sftp-server。)
MarnixKlooster ReinstateMonica

我广泛使用此解决方案以另一个用户的身份登录,该用户禁用了直接登录(出于审计和日志记录目的)。像ant之类的工具不会公开此子系统是很小的。但是,我建议不要以sudo root用户身份,而要以拥有足够特权执行所需操作的其他用户身份。需要解决的问题是,并非所有的unix环境都相同,并且sftp子系统可以位于不同的位置,如@MarnixKlooster
YoYo

对于Amazon Linux,整个命令为:“ sftp -s'sudo / usr / libexec / openssh / sftp-server'targethost.fqdn”
johntellsall

7

除了上面的评论中@MartinVonWittich所建议的内容之外您还可以为此活动设置专用的SSH密钥对,并将它们添加到root用户的/root/.ssh/authorized_keys文件中,从而将它们的范围限制为一个命令。

# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host

这将允许具有该对对应密钥的另一个系统以root用户身份通过​​SFTP进入该系统。您syslog和/或secure.log文件中仍会保留此连接的记录(假设您的发行版提供了这种级别的日志记录)。

注意:以这种方法访问服务器的任何人都可以全部使用cartes,因此请明智地使用它。最好还是继续读取,并将此功能与chroot和只读访问权限结合起来,以构造更严格的限制和针对特定位置的root用户访问权限。

chroot和只读

您可以在此处利用的另一种技术是限制SFTP连接,以便根据所使用的SSH密钥将它作为根切入特定位置。有关更多详细信息,请参阅我对标题为“ 使用SFTP限制无密码备份的 U&L问答”的回答。

您还可以sftp-server通过其开关-R和进行控制-d

 -d start_directory
         specifies an alternate starting directory for users.  The pathname 
         may contain the following tokens that are expanded at runtime: %%
         is replaced by a literal '%', %h is replaced by the home directory
         of the user being authenticated, and %u is replaced by the user‐
         name of that user.  The default is to use the user's home 
         directory.  This option is useful in conjunction with the 
         sshd_config(5) ChrootDirectory option.

 -R      Places this instance of sftp-server into a read-only mode.  
         Attempts to open files for writing, as well as other operations 
         that change the state of the filesystem, will be denied.

嗯,但是将命令限制为sftp-server不能使其更安全,对吗?如果攻击者可以访问此帐户,则可以使用SFTP轻松地为自己提供root shell。因此,从安全角度来看,命令限制几乎没有用处:)
Martin von Wittich 2014年

@MartinvonWittich-在我所举的例子中没有。那更多地显示了潜力。在不知道确切用例的情况下,很难显示真实的示例。root以任何形式提供SFTP访问都是很麻烦的,尤其是在没有chroot的情况下。
slm

3

我遵循的简单方法是仅sftp并将文件放在舞台区域(mkdir您在服务器上拥有权限的新目录)中,然后再次ssh使用sudo cp或将文件从那里移动到目的地sudo mv


1

我有一个类似的问题,就是我想使用vimdiff在一组使用cssh和sudo的大多数相似主机上编辑配置文件,您也许可以使我的解决方案适应您的工作流程。

sudoedit(sudo的一部分)允许您以常规用户身份使用任何编辑器来编辑您没有写许可权的文件,并且可以使用环境变量指定编辑器。sudoedit复制文件,使用副本的名称调用编辑器,然后等待编辑器退出,然后将修改后的副本复制回原来的位置。所以我创建了一个不会编辑的“编辑器”,只是记下文件以备后用,然后等待,并在vimdiff周围使用了该标记的包装器。

第一个文件是〜/ .bin / redit

#!/usr/bin/perl -w
use strict;
use warnings;
use Sys::Hostname;
my $file = $ENV{HOME}.'/.var/redit/'.hostname();
sub cmkdir($){
    my $_=shift;
    mkdir $_ unless -d $_;
}
cmkdir $ENV{HOME}.'/.var/';
cmkdir $ENV{HOME}.'/.var/redit/';
foreach (@ARGV){
    my $fh;
    open $fh, '>', $file.'na' or warn;
    print {$fh} $_;
    close $fh;
    symlink $_, $file or die;
    print;
    <STDIN>;
    unlink $file or die;
    unlink $file.'na' or die;
}

第二个是〜/ .bin / redit1

#!/usr/bin/perl -w
use strict;
use warnings;
use Sys::Hostname;
my $h=hostname();
@ARGV=qw(host1 host2 host3 host4) unless @ARGV;
print join " ", qw(gvimdiff), $ENV{HOME}.'/.var/redit/'.$h, map {'scp://'.$_.'/.var/redit/'.$_} grep {$_ ne $h} @ARGV;
exec qw(gvimdiff), $ENV{HOME}.'/.var/redit/'.$h, map {'scp://'.$_.'/.var/redit/'.$_} grep {$_ ne $h} @ARGV;

我使用它们的方式是使用cssh打开与所有四个主机的连接,然后使用,然后使用EDITOR=~/.bin/redit sudoedit /etc/conf/file,然后在不同的窗口中运行~/.bin/redit1,进行更改,保存并退出,切换回cssh并按Enter提交更改并退出sudoedit(除非我要编辑多个文件,在这种情况下,redit会前进到列表中的下一个文件,并且您需要对下一个文件再次运行redit1。)

由于您正在做的事情并不那么复杂,您只需要使用一个远程主机就不需要redit1了,因此您只需将sftp编辑器指向host:.var / redit / host或等效主机即可。


1

我要做的是使用scp代替(s)ftp,并sudo su -在WinSCP 中将外壳更改为Advanced \ SCP \ Shell中的外壳,但这适用于scp协议。


0

对于sftp:如果您具有ssh shell sudo访问权限,则可以将用户名添加到/ etc / group中的根用户组,然后将该组rx权限授予要访问的文件夹。


这是我的第一次尝试,但没有成功。我创建了一个用户并将其添加到root组中,我正在通过sftp连接,但仍然不允许我从“ / etc”等位置下载文件。我不确定自己做错了什么,但是我怀疑这个答案不起作用。
佩雷

0

您可以在服务器端插入sshd_config文件:

Subsystem sftp sudo -n true && sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server

这样,拥有NOPASSWD sudo权限的任何人都将获得root权限的sftp访问。


有什么Subsystem命令?在Ubuntu 16.04上,我收到“未找到命令”的消息
启发

这不是一个命令,但在一个条目的/ etc / SSH / sshd_config中
亚诺什Konkoly

0

在/ etc / ssh / sshd_config中添加此行对我来说是一个修复程序,并注释了现有的子系统行 Subsystem sftp sudo -n true && sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server

然后 sudo systemctl sshd restart

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.