Làm cách nào để sử dụng SFTP trên hệ thống yêu cầu sudo để xác thực dựa trên quyền truy cập & khóa ssh?


26

Tôi muốn có thể sử dụng SFTP để chỉnh sửa các tệp yêu cầu quyền root.

Tôi đang sử dụng xác thực dựa trên SSH Key - khóa rsa trên thẻ thông minh.

Nếu hệ thống yêu cầu sudo để thực hiện các lệnh cấp gốc, làm thế nào để tôi khắc phục điều này?

Tôi có thể tạo một cách bỏ qua sudo cho SFTP không?

Có cách nào để giữ xác thực sudo & key.

Tôi đang sử dụng windows để kết nối với Ubuntu. Tôi cũng cần điều này để làm việc với Mac kết nối với Ubuntu.

Tôi hiểu cách thực hiện SSH Tunneling để quản trị các dịch vụ hệ thống. Hiện tại, tôi sử dụng đăng nhập người dùng root trực tiếp, nhưng đăng nhập mật khẩu bị vô hiệu hóa. Tôi không hiểu cách sử dụng sudo và SFTP cùng một lúc. Nó có vẻ là một cách thực hành tốt nhất để yêu cầu đăng nhập với tư cách là người dùng không phải root và sau đó yêu cầu sử dụng sudo vì nhật ký sẽ ghi lại những người được cấp đặc quyền leo thang cho mỗi lệnh.

Tôi có nên quan tâm đến vấn đề này khi sử dụng xác thực dựa trên Key hay đây là một sự khác biệt nhỏ trong bảo mật / ghi nhật ký? Có vẻ như xác thực dựa trên khóa ghi lại số sê-ri của người dùng trong nhật ký và bạn có thể có nhiều khóa để người dùng root xác định từng người dùng. Điều này dường như là hiệu quả tương tự như sử dụng sudo với tôi. Tôi có lầm không?


2
Tôi chỉ cần sử dụng tài khoản root với xác thực dựa trên khóa trực tiếp và bỏ qua sudo.
Martin von Wittich

1
"Nó có vẻ là một cách thực hành tốt nhất để yêu cầu đăng nhập với tư cách là người dùng không phải root và sau đó yêu cầu sử dụng sudo vì nhật ký sẽ ghi lại những người được cấp đặc quyền leo thang cho mỗi lệnh." - nhưng điều đó không đáng bao nhiêu, bởi vì ai đó đã giành được quyền root có thể can thiệp vào nhật ký.
Martin von Wittich

Có bao nhiêu tập tin?
Nils

1
Chỉ cần lưu ý rằng có một câu trả lời đúng của sftp -s "sudo / usr / lib / openssh / sftp-server" targethost.fqdn bên dưới. Nếu sudo yêu cầu mật khẩu, bạn có thể đưa danh sách trắng một lệnh cụ thể này cho nopasswd.
Mikko Ohtamaa

Câu trả lời:


7

SFTP là một lệnh truy cập vào các hoạt động tập tin, với các hạn chế từ tài khoản bạn sử dụng. Bạn phải sử dụng ssh để thực hiện nhiều thao tác quản trị hơn, không thể sử dụng sudo và SFTP cùng một lúc. Nếu bạn cần truy cập vào toàn bộ đĩa mà không hạn chế sử dụng SFTP, hãy thực hiện bằng tài khoản root. Dù sao, bạn có thể tạo một đăng nhập với root trên sftp và ssh cùng một lúc, tất nhiên, bằng cách sử dụng hai phiên khác nhau.

Các khóa bảo mật cải thiện bảo mật và giúp ghi nhật ký dễ dàng hơn, không yêu cầu nhập bàn phím. Chỉ giúp đăng nhập, bạn có thể có một vài mật khẩu cho mọi người dùng tài khoản và có tác dụng tương tự.

EDIT: Tôi quên: bạn có thể tạo một tài khoản khác có cùng hiệu ứng với root nếu bạn gán id người dùng thành 0, nhưng không có ý nghĩa gì, nguy hiểm theo cách tương tự. Có thể cung cấp một số obfuscation nếu ai đó cố gắng đăng nhập như root, nhưng ngoài điều đó, không có nhiều ý nghĩa.


12

Gọi hệ thống con với sudo làm việc cho tôi.

Đến máy chủ Ubuntu chẳng hạn:

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

2
Điều này chỉ hoạt động nếu bạn không cần mật khẩu để sudo đó hoặc nếu bạn đã có vé sudo và đã tắt tty_tickets. Trên hầu hết các cài đặt hiện đại, không phải là mặc định.
Cheetah

Điều này là hoàn hảo cho các kết nối với các hệ thống Amazon Linux mặc định, nơi bạn kết nối với tư cách là người dùng ec2 và bạn có thể sử dụng sudo mà không cần mật khẩu. +1, cảm ơn! (Lưu ý rằng trên Amazon Linux, lệnh hơi khác một chút : sudo /usr/libexec/openssh/sftp-server.)
MarnixKlooster RebstateMonica

Tôi sử dụng giải pháp này rộng rãi để đăng nhập như một người dùng khác, nơi đăng nhập trực tiếp bị vô hiệu hóa (cho mục đích kiểm toán và đăng nhập). Đó là một điều nhỏ nhặt mà các công cụ như kiến ​​không phơi bày hệ thống con này. Tuy nhiên, tôi sẽ khuyên không bao giờ nên sudo để root, mà cho một người dùng khác có đủ đặc quyền để làm những gì bạn cần. Vấn đề cần giải quyết là không phải tất cả các môi trường unix đều giống nhau và hệ thống con sftp có thể được đặt ở các vị trí khác nhau như được ghi nhận bởi @MarnixKlooster
YoYo

Đối với Amazon Linux, toàn bộ lệnh là: "sftp -s 'sudo / usr / libexec / openssh / sftp-server' targethost.fqdn"
johntellsall

7

Ngoài những gì @MartinVonWittich đã đề xuất trong các nhận xét ở trên, bạn có thể thiết lập một cặp khóa SSH chuyên dụng chỉ cho hoạt động này và thêm chúng vào /root/.ssh/authorized_keystệp người dùng gốc giới hạn phạm vi của chúng chỉ bằng một lệnh.

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

Điều này sẽ cho phép một hệ thống khác có khóa tương ứng với cặp này để SFTP vào hệ thống này dưới dạng root. Bạn vẫn có bản ghi kết nối này trong tệp syslogvà / hoặc secure.logtệp của mình (giả sử bản phân phối của bạn cung cấp mức ghi nhật ký này).

LƯU Ý: Bất cứ ai truy cập vào máy chủ trong phương thức này sẽ có quyền truy cập cartes, vì vậy hãy sử dụng nó một cách khôn ngoan. Tốt hơn vẫn nên tiếp tục đọc và kết hợp khả năng này với truy cập chroot và chỉ đọc, để xây dựng các hạn chế chặt chẽ hơn và truy cập được nhắm mục tiêu đến các vị trí cụ thể dưới dạng root.

chroot & chỉ đọc

Kỹ thuật khác mà bạn có thể khai thác ở đây sẽ là giới hạn kết nối SFTP để nó được chia thành các vị trí cụ thể dưới dạng root, dựa trên khóa SSH được sử dụng. Xem câu trả lời của tôi cho Câu hỏi và trả lời của U & L này có tiêu đề: " Hạn chế sao lưu mật khẩu không có mật khẩu với SFTP " để biết thêm chi tiết.

Bạn cũng có thể kiểm soát sftp-serverthông qua các công tắc -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.

Hmm, nhưng hạn chế lệnh sftp-serverkhông làm cho nó an toàn hơn, phải không? Nếu kẻ tấn công giành được quyền truy cập vào tài khoản này, anh ta có thể dễ dàng cung cấp cho mình một vỏ gốc bằng SFTP. Vì vậy, giới hạn lệnh là khá vô dụng theo quan điểm bảo mật :)
Martin von Wittich

@MartinvonWittich - không có trong ví dụ tôi đã đưa vào. Đó là nhiều hơn để thể hiện tiềm năng. Không biết các trường hợp sử dụng chính xác, thật khó để đưa ra một ví dụ thực tế. Cho rootphép truy cập SFTP dưới mọi hình thức chỉ là rắc rối, đặc biệt là khi nó không bị chro.
slm

3

Cách tiếp cận đơn giản mà tôi đã làm là chỉ sftp và đặt các tệp trên một khu vực giai đoạn ( mkdirthư mục mới nơi bạn có quyền trên máy chủ) và sau đó ssh một lần nữa để di chuyển các tệp từ đó đến đích bằng sudo cphoặc sudo mv.


1

Tôi gặp một vấn đề tương tự là tôi muốn sử dụng vimdiff để chỉnh sửa các tệp cấu hình trên một nhóm các máy chủ chủ yếu tương tự, với cssh và sudo và bạn có thể điều chỉnh giải pháp của tôi theo quy trình công việc của bạn.

sudoedit (một phần của sudo) cho phép bạn sử dụng bất kỳ trình soạn thảo nào như một người dùng thông thường để chỉnh sửa một tệp mà bạn không có quyền ghi và bạn có thể chỉ định trình chỉnh sửa với biến môi trường. sudoedit sao chép (các) tệp, gọi trình soạn thảo với tên của (các) bản sao và đợi trình soạn thảo thoát ra, sau đó sao chép bản sao đã sửa đổi trở lại vị trí của nó. Vì vậy, tôi đã tạo một 'trình soạn thảo' không chỉnh sửa, chỉ cần lưu ý tệp để sử dụng sau này và chờ đợi và một trình bao bọc xung quanh vimdiff sử dụng điểm đánh dấu đó.

tập tin đầu tiên là ~ / .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;
}

thứ hai là ~ / .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;

Cách tôi sử dụng chúng là tôi sử dụng cssh để mở kết nối tới cả bốn máy chủ và sau đó sử dụng một lệnh như EDITOR=~/.bin/redit sudoedit /etc/conf/filesau đó Trong một cửa sổ khác ~/.bin/redit1, thực hiện các thay đổi của tôi, lưu và thoát, quay lại cssh và nhấn enter để thực hiện các thay đổi và thoát sudoedit (trừ khi tôi đang chỉnh sửa nhiều tệp trong trường hợp đó chuyển hướng tiến tới tệp tiếp theo trong danh sách và bạn chạy lại redit1 cho tệp tiếp theo.)

Vì những gì bạn đang làm ít phức tạp hơn, bạn không cần redit1 do chỉ làm việc với một máy chủ từ xa, bạn chỉ có thể trỏ trình soạn thảo sftp của mình vào máy chủ: .var / redit / host hoặc tương đương.


1

Những gì tôi làm là sử dụng scp thay vì (s) ftp và thay đổi shell thành sudo su -trong WinSCP, đây là trong Advanced \ SCP \ Shell, nhưng điều này chỉ hoạt động với giao thức scp.


0

Đối với sftp: Nếu bạn có quyền truy cập sudo shell sudo, bạn có thể thêm tên người dùng của mình vào nhóm người dùng gốc trong / etc / group và sau đó cấp quyền rx nhóm đó cho các thư mục bạn muốn truy cập.


Đây là nỗ lực đầu tiên của tôi và nó không hoạt động. Tôi đã tạo một người dùng và thêm nó vào rootnhóm, tôi đang kết nối qua sftp nhưng vẫn không cho phép tôi tải xuống các tệp từ các vị trí như '/ etc' và cứ thế. Tôi không chắc mình có làm gì sai không nhưng tôi nghi ngờ câu trả lời này không hiệu quả.
Pere

0

Bạn có thể chèn vào tệp sshd_config ở phía máy chủ:

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

Bằng cách này, bất cứ ai có NOPASSWD sudo đều sẽ có quyền truy cập sftp gốc.


Là gì Subsystemlệnh? Trên Ubuntu 16.04, tôi nhận được "lệnh không tìm thấy"
lấy cảm hứng từ

Đó không phải là một lệnh mà là một mục trong / etc / ssh / sshd_config
János Konkoly

0

Thêm dòng này tại / etc / ssh / sshd_config là một sửa chữa cho tôi và nhận xét dòng hệ thống con hiện có Subsystem sftp sudo -n true && sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server

sau đó sudo systemctl sshd restart

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.