루트 액세스 및 SSH 키 기반 인증을 위해 sudo가 필요한 시스템에서 SFTP를 사용하는 방법은 무엇입니까?


26

SFTP를 사용하여 루트 권한이 필요한 파일을 편집하고 싶습니다.

스마트 카드의 SSH 키 기반 인증-rsa 키를 사용하고 있습니다.

시스템에 루트 레벨 명령을 수행하기 위해 sudo가 필요한 경우 어떻게 해결해야합니까?

SFTP에 대해서만 sudo를 우회하는 방법을 만들 수 있습니까?

sudo 및 키 인증을 유지하는 방법이 있습니까?

우분투에 연결하기 위해 창을 사용하고 있습니다. 우분투에 연결하는 Mac에서도 작동하려면 이것이 필요합니다.

시스템 서비스를 관리하기 위해 SSH 터널링을 수행하는 방법을 알고 있습니다. 현재 루트 사용자 로그인을 직접 사용하지만 비밀번호 로그인이 비활성화되어 있습니다. sudo와 SFTP를 동시에 사용하는 방법을 이해하지 못했습니다. 루트가 아닌 사용자로 로그인 한 다음 각 명령에 대해 에스컬레이션 된 권한이 부여 된 사용자를 로그에 기록하므로 sudo를 사용해야하는 것이 가장 좋습니다.

키 기반 인증을 사용할 때이 문제에 관심을 가져야합니까, 아니면 보안 / 로깅에서 사소한 차이입니까? 키 기반 인증은 로그에 사용자의 일련 번호를 기록하는 것처럼 보이며 루트 사용자가 각 사용자를 식별하기 위해 여러 키를 가질 수 있습니다. 이것은 sudo를 사용하는 것과 같은 효과 인 것 같습니다. 내가 잘못?


2
키 기반 인증으로 루트 계정을 직접 사용하고 건너 뛰었습니다 sudo.
Martin von Wittich

1
"루트가 아닌 사용자로 로그인하고 로그에 각 명령에 대해 에스컬레이션 된 권한이 부여 된 사용자를 기록하므로 sudo를 사용해야하는 것이 가장 좋습니다." 그러나 루트 권한을 얻은 사람은 어쨌든 로그를 조작 할 수 있기 때문에 그다지 가치가 없습니다.
Martin von Wittich

파일이 몇 개입니까?
Nils

1
아래의 sftp -s "sudo / usr / lib / openssh / sftp-server"targethost.fqdn에 대한 정답이 하나 있습니다. sudo에 비밀번호가 필요한 경우 nopasswd에 대해이 특정 명령을 허용 목록에 추가 할 수 있습니다.
Mikko Ohtamaa

답변:


7

SFTP는 사용하는 계정의 제한 사항이있는 파일 작업에 대한 명령 액세스입니다. 더 많은 관리 작업을하려면 ssh를 사용해야하며 sudo 및 SFTP를 동시에 사용할 수 없습니다. SFTP를 사용하여 제한없이 전체 디스크에 액세스해야하는 경우 루트 계정을 사용하여 수행하십시오. 어쨌든 두 개의 다른 세션을 사용하여 sftp와 ssh에서 root로 로그인 할 수 있습니다.

보안 키는 키보드 입력없이 보안을 향상시키고 로깅을보다 쉽게 ​​만듭니다. 로그인하는 데만 도움이되며 모든 계정 사용자에 대해 여러 개의 비밀번호를 사용할 수 있으며 동일한 효과가 있습니다.

편집 : 잊어 버렸습니다 : 사용자 ID를 0에 할당했지만 같은 의미로 위험하지 않은 경우 root와 동일한 효과로 다른 계정을 만들 수 있습니다. 누군가 루트처럼 로그인을 시도하면 혼란 스러울 수 있지만 그 외에는 의미가 없습니다.


12

sudo로 서브 시스템을 호출하면 나에게 도움이되었습니다.

예를 들어 우분투 호스트에게 :

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

2
sudo에 암호가 필요하지 않거나 이미 sudo 티켓이 있고 tty_tickets가 비활성화 된 경우에만 작동합니다. 대부분의 최신 설치에서는 둘 다 기본값이 아닙니다.
치타

이는 사용자 ec2-user로 연결하는 기본 Amazon Linux 시스템에 연결하는 데 적합하며 비밀번호없이 sudo를 사용할 수 있습니다. +1 감사합니다! (Amazon Linux에서는 명령이 약간 다릅니다 sudo /usr/libexec/openssh/sftp-server.)
MarnixKlooster ReinstateMonica

이 솔루션을 광범위하게 사용하여 직접 로그인이 비활성화 된 (감사 및 로깅 목적으로) 다른 사용자로 로그인합니다. 개미와 같은 도구 가이 하위 시스템을 노출시키지 않는 것은 사소한 일입니다. 그러나 루트에 sudo 하지 말고 필요한 것을 수행 할 수있는 충분한 권한을 가진 다른 사용자 에게 권합니다 . 해결해야 할 문제는 모든 유닉스 환경이 동일하지는 않으며, sftp 서브 시스템은 @MarnixKlooster
YoYo

Amazon Linux의 경우 전체 명령은 "sftp -s 'sudo / usr / libexec / openssh / sftp-server'targethost.fqdn"
johntellsall

7

위의 주석에서 @MartinVonWittich가 제안한외에도이 활동을 위해 전용 SSH 키 쌍을 설정하고 루트 사용자의 /root/.ssh/authorized_keys파일에 추가하여 범위를 단일 명령으로 제한 할 수 있습니다.

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

이렇게하면이 쌍에 해당하는 키가있는 다른 시스템이이 시스템의 SFTP에 루트로 액세스 할 수 있습니다. 배포판에이 수준의 로깅이 있다고 가정하면 파일 syslog및 / 또는 secure.log파일 에이 연결에 대한 기록이 여전히 남아 있습니다 .

참고 : 이 방법으로 서버에 액세스하는 사람은 누구나 카트에 액세스 할 수 있으므로 현명하게 사용하십시오. 더 나은 읽기를 계속하고이 기능을 chroot 및 읽기 전용 액세스와 결합하여 더 엄격한 제한을 설정하고 루트로 특정 위치에 대한 대상 액세스를 설정하십시오.

chroot 및 읽기 전용

여기에서 악용 할 수있는 다른 기술은 SFTP 연결을 제한하여 SSH가 사용 된 SSH 키를 기반으로 루트로 특정 위치에 chroot되도록하는 것입니다. 자세한 내용은이 "U & L Q & A에 대한 답변 :" SFTP를 사용하여 암호없는 백업 제한 "을 참조하십시오.

또한 제어 할 수 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를 사용하여 자신에게 루트 셸을 쉽게 제공 할 수 있습니다. 따라서 보안상의 관점에서 명령 제한은 쓸모가 없습니다 :)
Martin von Wittich

@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를 종료하십시오 (두 개 이상의 파일을 편집하는 경우 목록의 다음 파일로 리딧이 진행되고 다음 파일에 대해 redit1을 다시 실행하지 않는 한).

당신이하고있는 일이 덜 복잡하기 때문에 하나의 원격 호스트로 작업하기 때문에 redit1이 필요하지 않으므로 sftp 편집기를 host : .var / redit / host 또는 이와 동등한 것으로 지정할 수 있습니다.


1

내가하는 일은 (s) ftp 대신 scp를 사용 sudo su -하고 WinSCP 에서 셸을 Advanced \ SCP \ Shell에 변경하지만 scp 프로토콜 에서만 작동합니다.


0

sftp의 경우 : ssh shell sudo access가있는 경우, 사용자 이름을 / etc / group의 루트 사용자 그룹에 추가 한 다음 액세스하려는 폴더에 해당 그룹 rx 권한을 부여 할 수 있습니다.


이것은 나의 첫 번째 시도이며 작동하지 않습니다. 사용자를 만들어 root그룹에 추가했는데 sftp를 통해 연결하고 있지만 여전히 '/ etc'와 같은 위치에서 파일을 다운로드 할 수는 없습니다. 내가 잘못하고 있는지 확실하지 않지만이 답변이 효과가 없다고 생각합니다.
Pere

0

서버 측에서 sshd_config 파일에 삽입 할 수 있습니다.

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

이 방법으로 NOPASSWD sudo 권한이있는 사람은 루트 sftp 액세스 권한을 얻게됩니다.


무엇 Subsystem명령은? 우분투 16.04에서 "명령을 찾을 수 없습니다"
inspirednz

명령이 아니라 / etc / ssh / sshd_config의 항목
János 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.