วิธีการใช้ SFTP บนระบบที่ต้องใช้ sudo สำหรับการเข้าถึงรูตและการพิสูจน์ตัวตนโดยใช้รูทคีย์ & ssh?


26

ฉันต้องการใช้ SFTP เพื่อแก้ไขไฟล์ที่ต้องได้รับอนุญาตรูท

ฉันใช้การรับรองความถูกต้องโดยใช้คีย์ SSH - คีย์ rsa บนสมาร์ทการ์ด

หากระบบต้องการ sudo เพื่อดำเนินการคำสั่งระดับรูทฉันจะแก้ไขได้อย่างไร

ฉันสามารถสร้างวิธีการเลี่ยงผ่าน sudo สำหรับ SFTP ได้หรือไม่

มีวิธีในการเก็บ sudo & การรับรองความถูกต้องของคีย์หรือไม่

ฉันใช้ windows เพื่อเชื่อมต่อกับ Ubuntu ฉันต้องการสิ่งนี้เพื่อทำงานกับ Mac ที่เชื่อมต่อกับ Ubuntu ด้วย

ฉันเข้าใจวิธีการทำ SSH Tunneling เพื่อดูแลระบบบริการ ปัจจุบันฉันใช้การล็อกอินของผู้ใช้รูทโดยตรง แต่การล็อกอินรหัสผ่านถูกปิดใช้งาน ฉันไม่เข้าใจวิธีการใช้ sudo และ SFTP ในเวลาเดียวกัน น่าจะเป็นวิธีปฏิบัติที่ดีที่สุดที่จะต้องมีการล็อกอินในฐานะผู้ใช้ที่ไม่ใช่รูทและต้องการใช้ sudo เนื่องจากบันทึกจะบันทึกว่าใครได้รับสิทธิพิเศษที่เพิ่มขึ้นสำหรับแต่ละคำสั่ง

ฉันควรจะกังวลกับสิ่งนี้เมื่อใช้การพิสูจน์ตัวตนแบบใช้คีย์หรือนี่เป็นความแตกต่างเล็กน้อยในการรักษาความปลอดภัย / การบันทึก ดูเหมือนว่าการพิสูจน์ตัวตนแบบใช้คีย์จะบันทึกหมายเลขซีเรียลของผู้ใช้ในบันทึกและคุณสามารถมีได้หลายคีย์สำหรับผู้ใช้รูทเพื่อระบุผู้ใช้แต่ละคน ดูเหมือนว่าจะมีผลเช่นเดียวกับการใช้ sudo กับฉัน ฉันผิดหรือเปล่า?


2
ฉันจะใช้บัญชีรูทด้วยการตรวจสอบสิทธิ์แบบใช้คีย์โดยตรงแล้วข้ามsudoไป
Martin von Wittich

1
"ดูเหมือนว่าวิธีปฏิบัติที่ดีที่สุดคือต้องใช้การล็อกอินในฐานะผู้ใช้ที่ไม่ใช่รูทแล้วต้องใช้ sudo เนื่องจากบันทึกจะบันทึกว่าใครได้รับสิทธิพิเศษที่เพิ่มขึ้นสำหรับแต่ละคำสั่ง" - แต่นั่นไม่คุ้มค่ามากนักเพราะคนที่ได้รับสิทธิ์การใช้งานรูทสามารถแก้ไขบันทึกได้
Martin von Wittich

มีไฟล์กี่ไฟล์?
นิลส์

1
เพียงสังเกตว่ามีคำตอบที่ถูกต้องหนึ่งข้อของ sftp -s "sudo / usr / lib / openssh / sftp-server" Targethost.fqdn ด้านล่าง ถ้า sudo ต้องการรหัสผ่านคุณสามารถขึ้นบัญชีขาวเดียวของ nopasswd ได้
Mikko Ohtamaa

คำตอบ:


7

SFTP เป็นการเข้าถึงคำสั่งไปยังการทำงานของไฟล์โดยมีข้อ จำกัด จากบัญชีที่คุณใช้ คุณต้องใช้ ssh เพื่อดำเนินการดูแลระบบมากขึ้นทำให้ใช้ sudo และ SFTP ไปไม่ได้ในเวลาเดียวกัน หากคุณต้องการเข้าถึงดิสก์ทั้งหมดโดยไม่ จำกัด การใช้ SFTP ทำได้โดยใช้บัญชีรูท อย่างไรก็ตามคุณสามารถลงชื่อเข้าใช้ด้วยรูทบน sftp และ ssh ในเวลาเดียวกันโดยใช้สองเซสชันที่ต่างกัน

ปุ่มความปลอดภัยช่วยปรับปรุงความปลอดภัยและทำให้การบันทึกง่ายขึ้นโดยไม่ต้องใช้แป้นพิมพ์ ช่วยในการเข้าสู่ระบบเท่านั้นคุณสามารถมีรหัสผ่านหลายรายการสำหรับผู้ใช้บัญชีทุกคนและมีผลเหมือนกัน

แก้ไข: ฉันลืม: คุณสามารถสร้างบัญชีอื่นที่มีผลกระทบเดียวกับรูทหากคุณกำหนด ID ผู้ใช้ให้เป็น 0 แต่ไม่มีเหตุผลใด ๆ และเป็นอันตรายในลักษณะเดียวกัน อาจให้ความสับสนถ้าใครบางคนพยายามที่จะเข้าสู่ระบบเช่นราก แต่นอกเหนือจากนั้นไม่ได้มีความรู้สึกมาก


12

การเรียกระบบย่อยด้วย sudo นั้นใช้ได้สำหรับฉัน

ไปยังโฮสต์ Ubuntu เช่น:

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

2
ใช้งานได้เฉพาะในกรณีที่คุณไม่ต้องใช้รหัสผ่านในการ sudo นั้นหรือถ้าคุณมีตั๋ว sudo แล้วและปิดการใช้งาน tty_tickets ในการติดตั้งที่ทันสมัยที่สุดไม่มีค่าเริ่มต้น
Cheetah

นี่คือที่สมบูรณ์แบบสำหรับการเชื่อมต่อกับระบบ Amazon Linux เริ่มต้นที่คุณเชื่อมต่อในฐานะผู้ใช้ ec2 ผู้ใช้และคุณสามารถใช้ sudo โดยไม่ต้องใช้รหัสผ่าน +1 ขอบคุณ! (โปรดสังเกตว่าใน Amazon Linux, คำสั่งแตกต่างกันเล็กน้อย: sudo /usr/libexec/openssh/sftp-server.)
MarnixKlooster ReinstateMonica

ฉันใช้โซลูชันนี้อย่างกว้างขวางเพื่อลงชื่อเข้าใช้ในฐานะผู้ใช้อื่นที่ปิดใช้งานการเข้าสู่ระบบโดยตรง (เพื่อวัตถุประสงค์ในการตรวจสอบและบันทึก) มันเป็นเรื่องเล็กน้อยที่เครื่องมืออย่างมดไม่ได้เปิดเผยระบบย่อยนี้ อย่างไรก็ตามฉันจะไม่แนะนำให้ sudo รูท แต่ให้ผู้ใช้รายอื่นที่มีสิทธิ์เพียงพอที่จะทำสิ่งที่คุณต้องการ ปัญหาที่ต้องจัดการคือสภาพแวดล้อม unix ไม่เหมือนกันทั้งหมดและระบบย่อย 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ไฟล์ของคุณ (สมมติว่า distro ของคุณมีการบันทึกระดับนี้)

หมายเหตุ:ใครก็ตามที่เข้าถึงเซิร์ฟเวอร์ในวิธีนี้จะมีการเข้าถึงแบบ blanche เพื่อใช้อย่างชาญฉลาด ยังคงดีกว่าการอ่านและการรวมความสามารถนี้กับ chroot และการเข้าถึงแบบอ่านอย่างเดียวเพื่อสร้างข้อ จำกัด ที่เข้มงวดมากขึ้นและการเข้าถึงที่ตั้งเป้าหมายไปยังตำแหน่งที่เฉพาะเจาะจงในฐานะรูท

chroot & อ่านได้อย่างเดียว

เทคนิคอื่น ๆ ที่คุณสามารถใช้ประโยชน์จากที่นี่คือการ จำกัด การเชื่อมต่อ SFTP เพื่อให้มันถูก chrooted ไปยังตำแหน่งที่เฉพาะเจาะจงในฐานะรูทโดยใช้คีย์ SSH ดูคำตอบของฉันสำหรับคำถาม & คำตอบ U & L นี้: " จำกัด การสำรองข้อมูลโดยไม่ใช้รหัสผ่านด้วย 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 ดังนั้นข้อ จำกัด คำสั่งคือรักที่ไร้ประโยชน์จากจุดรักษาความปลอดภัยของมุมมอง :)
มาร์ตินฟอน Wittich

@MartinvonWittich - ไม่ได้อยู่ในตัวอย่างที่ฉันได้รวมไว้ นั่นเป็นการแสดงให้เห็นถึงศักยภาพมากกว่า กรณีที่ใช้งานไม่ถูกต้องเป็นการยากที่จะแสดงตัวอย่างในโลกแห่งความเป็นจริง การให้การrootเข้าถึง SFTP ในรูปแบบใด ๆ เป็นปัญหาโดยเฉพาะอย่างยิ่งเมื่อไม่ได้ chrooted
slm

3

วิธีการง่ายๆที่ผมทำตามเป็นเพียง SFTP และวางไฟล์ในพื้นที่เวที ( mkdirไดเรกทอรีใหม่ที่คุณมีสิทธิ์บนเซิร์ฟเวอร์) และจากนั้น SSH อีกครั้งเพื่อย้ายไฟล์จากที่นั่นไปยังปลายทางด้วยหรือsudo cpsudo 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 ไปที่โฮสต์: .var / redit / host หรือเทียบเท่า


1

สิ่งที่ฉันทำคือการใช้ SCP แทน (s) FTP, และเปลี่ยนเปลือกไปsudo su -ใน WinSCP นี้อยู่ในขั้นสูง \ SCP \ เชลล์ แต่เพียงทำงานร่วมกับโปรโตคอล SCP


0

สำหรับ sftp: หากคุณมีการเข้าถึง ssh shell sudo คุณสามารถเพิ่มชื่อผู้ใช้ของคุณไปยังกลุ่มผู้ใช้รูทใน / 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

วิธีนี้ใครก็ตามที่มีสิทธิ์ SOP ของ NOPASSWD จะได้รับสิทธิ์เข้าถึง SFTP แบบรูท


อะไรคือSubsystemคำสั่ง? บน Ubuntu 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.