Cho phép truy cập vỏ SSH nhưng vô hiệu hóa quyền truy cập SFTP


21

Tôi đã tìm kiếm một câu trả lời khả thi cho câu hỏi này và hầu hết các câu trả lời bao gồm lời khuyên về lý do tại sao không làm điều đó. Tuy nhiên, đây là kịch bản và điều gì cần thiết:

Tôi có một ứng dụng bảng điều khiển và trong .profile của mỗi người dùng, có một lệnh khởi động cho ứng dụng và ngay sau lệnh khởi động nó, có lệnh "exit", sẽ đăng xuất chúng ra khỏi hệ thống. Tôi chỉ muốn họ có thể truy cập ứng dụng bảng điều khiển này thông qua giao diện do nó cung cấp. Khi khởi động, ứng dụng sẽ hiển thị cho người dùng một danh sách khách hàng có thể được truy cập thông qua ứng dụng, với mỗi khách hàng có thư mục dữ liệu riêng. Người dùng chỉ được cấp quyền truy cập cho các khách hàng mà họ sẽ cần quyền truy cập.

Bây giờ đây là vấn đề: Nếu tôi cấp cho người dùng quyền truy cập SSH, họ cũng sẽ có thể đăng nhập bằng ứng dụng khách SFTP, điều này sẽ cho phép họ truy cập trực tiếp vào các thư mục dữ liệu cho ứng dụng, điều này RẤT không mong muốn, vì điều đó cũng sẽ cung cấp họ truy cập vào các thư mục dữ liệu mà họ không nên truy cập.

Đây là một việc đơn giản để làm khi sử dụng kết hợp telnet / FTP, nhưng bây giờ tôi muốn cung cấp cho người dùng quyền truy cập từ bất kỳ đâu trên internet, tôi đã không thể tìm cách tắt chúng khỏi SFTP, trong khi vẫn cho phép họ truy cập vào trình bao nơi họ có thể chạy ứng dụng.


8
Tôi quên các chi tiết, nhưng tôi nghĩ SSH cho phép bạn hạn chế người dùng chạy một lệnh duy nhất khi họ đăng nhập. Họ không có quyền truy cập shell đầy đủ nếu bạn thiết lập điều này. Nó có thể hữu ích cho trường hợp sử dụng của bạn. (Sau tất cả, có thể mô phỏng quyền truy cập SFTP bằng SSHFS. Chỉ cần vô hiệu hóa SFTP sẽ không ngăn người dùng được xác định vừa phải truy cập vào bất kỳ tệp nào mà tài khoản người dùng của họ có quyền truy cập.)
David Z

3
Ngoài ra, bạn có thể muốn xem xét "chroot" người dùng của mình. và để truy cập dữ liệu dự phòng, có vẻ như đó là sự cố thiết kế
Dennis Nolte

2
Sử dụng .profilecho âm thanh đó như giải pháp sai. Tôi tin rằng thiết lập người dùng với một vỏ thay thế sẽ có ý nghĩa hơn nhiều.
kasperd

3
Đừng cố sử dụng .profilethủ thuật để hạn chế quyền truy cập, vì việc bỏ qua nó là chuyện nhỏ. (xem câu trả lời của tôi để biết chi tiết)
Aleksi Torhamo

Câu trả lời:


22

Chỉnh sửa:

Trong trường hợp không rõ ràng, câu trả lời sau đây không nhằm mục đích là một phương pháp an toàn để ngăn chặn SFTP được sử dụng bởi bất kỳ ai có quyền truy cập shell vào máy chủ. Đó chỉ là một câu trả lời giải thích cách vô hiệu hóa nó khỏi tầm nhìn bên ngoài. Để thảo luận về bảo mật cấp độ người dùng, hãy xem câu trả lời từ @cpast và @Aleksi Torhamo. Nếu bảo mật là trọng tâm của bạn, câu trả lời này không phải là câu trả lời thích hợp. Nếu visibiliy dịch vụ đơn giản là trọng tâm của bạn, thì đây là câu trả lời của bạn.

Bây giờ chúng tôi tiếp tục câu trả lời ban đầu:


Nhận xét hỗ trợ sftp trong sshd_config (và tất nhiên khởi động lại sshd):

#Subsystem sftp /usr/lib/openssh/sftp-server


1
Đôi khi dòng có thể làSubsystem sftp internal-sftp
Kondybas

1
Tôi có Subsystem sftp /usr/libexec/sftp-server Nhưng điều đó đã lừa. Cảm ơn bạn rất nhiều
sosaisapunk

16
Điều này không có vẻ hợp lý. Nếu bạn có thể thực thi các lệnh tùy ý trên máy chủ, bạn có thể thực thi chương trình phía máy chủ sftp. Ngay cả khi nó không được cài đặt, bạn vẫn có thể thực hiện lại dưới dạng lệnh shell dài và ứng dụng khách sftp gửi lệnh này thay vì sftp. Phương pháp này có thể làm cho việc sử dụng sftp không thuận tiện hơn nhưng không có cách nào để ngăn người dùng có thể chạy các lệnh tùy ý sử dụng các lệnh đó để thực hiện chuyển tệp.
R ..

1
@sosaisapunk Điều đó không đúng. Người dùng có thể chạy bất kỳ lệnh nào họ muốn bằng cách sử dụng ssh user@host command, vì .profilesẽ không được chạy nếu bạn làm điều đó, và do đó ứng dụng của bạn sẽ không bắt đầu. Họ có thể có được quyền truy cập shell đầy đủ bằng cách nói đơn giản ssh -t user@host bash. Chỉ cần thử nó và bạn sẽ thấy. Hệ thống con chỉ là một bí danh lệnh; nếu họ có thể sử dụng sftp trước đó, họ vẫn có thể sử dụng nó - và bất kỳ lệnh nào khác họ muốn. Đọc câu trả lời của tôi dưới đây.
Aleksi Torhamo

1
@sosaisapunk: Không, vấn đề là bạn có thể làm điều này với ssh, nhưng không phải .profilevì nó không có nghĩa là để bảo mật và dễ dàng bị bỏ qua. Trong câu trả lời của tôi, tôi đã liệt kê ba phương pháp khác nhau để làm điều đó với ssh. Nói tóm lại, chỉ cần di chuyển lời gọi ứng dụng của bạn từ .profiletập lệnh shell và 1) đặt tập lệnh shell là shell của người dùng 2) đặt tập lệnh shell thành (khớp chính xác) ForceCommandtrong sshd_config3) để chuyển sang xác thực khóa chung và đặt shell script như commandtrong .ssh/authorized_keys. (Ngoài ra, bạn nên sử dụng @name để mọi người nhận được thông báo về các nhận xét)
Aleksi Torhamo

28

Như những người khác đã đề cập, việc vô hiệu hóa sftpkhông ở đâu đủ gần - người dùng có quyền sshtruy cập không hạn chế có thể xem bất kỳ tệp nào mà tài khoản của họ có quyền xem, có thể sửa đổi bất cứ điều gì họ có quyền sửa đổi và có thể dễ dàng tải xuống bất cứ điều gì họ có thể đọc cho riêng mình máy móc. Cách duy nhất để ngăn họ làm điều này là thực sự hạn chế quyền truy cập của họ. Thật không lý tưởng khi dựa vào .profileđể hạn chế người dùng, vì đó không phải là điều dành cho (Chỉnh sửa: Như Aleksi đã đề cập trong câu trả lời của anh ấy, thực tế là không quan trọng để bỏ qua .profile; vấn đề .profilelà vì nó thuận tiện, không phải bảo mật, nên không nhằm hạn chế người dùng. Sử dụng những thứ được thiết kế để bảo mật, như những thứ bên dưới, để cung cấp bảo mật).

Có hai cách cơ bản để làm điều này: bạn có thể hạn chế chúng thông qua quyền truy cập tệp hoặc buộc chúng chỉ thực thi ứng dụng bảng điều khiển của bạn. Cách thứ hai là tốt hơn: Chỉ định người dùng nên được giới hạn trong ứng dụng bảng điều khiển cho một nhóm (ví dụ customers); sau đó, vào sshd_config, thêm các dòng sau:

Match Group customers
ForceCommand /path/to/app

Điều này làm là làm cho nó để tất cả các kết nối từ người dùng trong nhóm đó mở ứng dụng bảng điều khiển; họ không thể bắt đầu bất cứ điều gì khác, kể cả sftpcông cụ máy chủ. Điều này cũng ngăn họ làm bất cứ điều gì khác với hệ thống, và không giống như .profilevậy, bằng cách sử dụng chính máy chủ SSH ( .profilehạn chế chúng ở trình bao, ForceCommandcũng ngăn chặn việc thực hiện những việc khác không liên quan đến việc khởi động trình bao). Cũng không giống như .profile, điều này được thiết kế như một điều bảo mật; nó được chế tạo đặc biệt để chống lại người dùng độc hại trốn tránh nó.

Sự thay thế (có thể kém hơn) sẽ liên quan đến việc tạo người dùng mới để chạy ứng dụng bảng điều khiển. Sau đó, bạn sẽ giới hạn các thư mục dữ liệu cho người dùng đó, đặt ứng dụng bảng điều khiển do người dùng đó sở hữu và đặt u+strên chương trình. Đây là setuidbit; điều đó có nghĩa là ai đó chạy chương trình điều khiển sẽ làm như vậy với sự cho phép của chủ sở hữu chương trình. Bằng cách đó, người dùng không có quyền truy cập vào các thư mục, họ chỉ nhận được nó thông qua chương trình. Tuy nhiên, có lẽ bạn chỉ nên sử dụng ForceCommand, vì điều đó hạn chế tất cả quyền truy cập vào "chỉ chạy chương trình này".


4
Tôi muốn thêm rằng điều ForceCommandđó không ngăn chuyển tiếp cổng SSH.
nyuszika7h

1
Thật ra, dựa vào .profilenhiều hơn là "không lý tưởng"; nó dễ dàng bị bỏ qua (xem câu trả lời của tôi để biết chi tiết) và do đó không cung cấp sự bảo vệ nào, chỉ có cảm giác an toàn sai lầm.
Aleksi Torhamo

@AleksiTorhamo À. Tôi nghi ngờ bạn có thể bỏ qua nó, nhưng không chắc chắn bằng cách nào (tôi thường nghi ngờ rằng những thứ không nhằm mục đích bảo mật là có thể bỏ qua). Cảm ơn các chi tiết về làm thế nào!
cpast

15

Đừng cố gắng làm điều này .profilevì nó không cung cấp bảo mật nào và hạn chế chính xác không có gì!

Không quan trọng bạn đặt gì vào .profile, vì bạn có thể bỏ qua nó bằng cách chỉ cần đưa ra lệnh để chạy trên dòng lệnh ssh, như thế này : ssh user@host command. Bạn vẫn có thể truy cập shell bình thường bằng cách làm ssh -t user@host bash.

Vô hiệu hóa hệ thống con sftp, như được đề cập trong câu trả lời khác, hoàn toàn không giúp ích gì. Các hệ thống con về cơ bản chỉ là bí danh cho các lệnh và bạn vẫn có thể sử dụng sftp bình thường bằng cách thực hiện sftp -s /path/to/sftp-executable user@host.

Giống như cpast và một số nhà bình luận đã nói, bạn nên sử dụng các cơ chế phù hợp để hạn chế quyền truy cập. Đó là,

  • Sử dụng ForceCommandtrongsshd_config
  • Sử dụng đăng nhập không mật khẩu và command="..."trong.ssh/authorized_keys
  • Thay đổi trình bao của người dùng thành thứ gì đó hạn chế những gì người dùng có thể làm

Ghi chú:

  • command="..." chỉ áp dụng cho một khóa, vì vậy nó không hạn chế đăng nhập ssh cho người dùng bằng mật khẩu hoặc khóa khác
  • Bạn cũng có thể muốn hạn chế chuyển tiếp cổng, v.v. (chuyển tiếp cổng, chuyển tiếp x11, chuyển tiếp đại lý và phân bổ pty là những điều tôi đã nghe nói về)
    • AllowTcpForwarding v.v. sshd_config
    • no-port-forwarding v.v. .ssh/authorized_keys
  • Nếu bạn có các trình tiện ích khác (như FTP) đang chạy, bạn nên xác minh rằng họ không cho phép người dùng vào (Một số trình nền đưa ra quyết định này dựa trên trình bao của người dùng, vì vậy nếu bạn thay đổi điều đó, bạn có thể muốn kiểm tra lại điều này)
  • Bạn có thể thay đổi trình bao của người dùng thành tập lệnh thực hiện những gì bạn muốn; Nó chạy hoặc không có đối số hoặc thíchscript -c 'command-the-user-wanted-to-run'
  • Cả hai ForceCommandcommand="..."chạy lệnh thông qua trình bao của người dùng, vì vậy chúng không hoạt động nếu trình bao của người dùng được đặt thành ví dụ. /bin/falsehoặc là/sbin/nologin

Tuyên bố miễn trừ trách nhiệm: Tôi không phải là chuyên gia về vấn đề này, vì vậy trong khi tôi có thể nói rằng .profileđiều đó không an toàn, tôi không thể hứa rằng sẽ không có "gotcha" với các phương pháp khác mà tôi không biết trong khoảng. Họ an toàn theo như tôi biết, nhưng tôi sẽ không phải là người đầu tiên sai trên internet.


1
Dường như ít nhất là cho ForceCommandvà buộc mật mã đăng nhập với command=trong authorized_keys, trong khi nó đã được bỏ qua trước đó, rằng nhân do một lỗi trong máy chủ: nó được dự định để được an toàn chống lại một người sử dụng độc hại và người dùng bỏ qua thì coi như là lỗ hổng nghiêm trọng trong máy chủ SSH (và do đó là bản sửa lỗi ưu tiên). Như bạn chỉ ra, .profilecó thể bỏ qua theo thiết kế: vì nó không được coi là một tính năng bảo mật, người dùng bỏ qua nó là hoàn toàn OK theo quan điểm của nhà phát triển hệ vỏ.
cpast

1
@cpast: Vâng, tôi đã suy nghĩ về sự tồn tại của nhiều tính năng hơn như chuyển tiếp cổng. Ý tôi là, nếu bạn không biết rằng ssh cho phép chuyển tiếp cổng và chỉ được sử dụng ForceCommandđể hạn chế quyền truy cập và có một trình nền chỉ nghe các kết nối cục bộ và không thực hiện xác thực, người dùng ssh vẫn có thể truy cập vào daemon. Các tính năng tôi liệt kê là những tính năng, ví dụ. Các giải pháp lưu trữ git thường vô hiệu hóa và tôi chưa thấy bất kỳ giải pháp "trông xấu xa" nào trong các trang, nhưng tôi chưa tìm thấy bất kỳ loại chính thức nào "đây là cách bạn sử dụng ForceCommandmột cách an toàn".
Aleksi Torhamo

Phải thừa nhận rằng ~/.profilengười dùng có thể chỉnh sửa và không hữu ích cho bảo mật, nhưng bạn có thể làm cho kỹ thuật của cpast có ý nghĩa bằng cách đưa nó vào /etc/profilekhông? Bạn có thể kiểm tra UID để giới hạn nó cho đúng người dùng.
gà con

1
@chicks: Không, nó có cùng một vấn đề. Vấn đề không phải là tập tin có thể chỉnh sửa được; Vấn đề là cả hai tập tin có thể được bỏ qua hoàn toàn. Các tệp chỉ được sử dụng cho shell đăng nhập, mà bạn nhận được nếu bạn chỉ nói ssh user@host, nhưng nếu bạn bảo ssh chạy lệnh - tức là. ssh user@host command- bạn không còn nhận được vỏ đăng nhập và các tệp không được chạm vào. Vì vậy, bạn có thể bỏ qua bất kỳ hạn chế nào mà ai đó đã cố gắng tạo với các tệp bằng cách đơn giản đưa ra một đối số bổ sung cho ssh.
Aleksi Torhamo

2
@chicks: Ngoài ra, tôi chỉ nhận ra rằng bạn đã đề cập đến cpast; phương pháp trong câu trả lời của cpast không sử dụng .profile, nó sử dụng sshd_configvà nên an toàn. Anh ta chỉ đề cập đến .profilenhư một phương pháp mà bạn không nên sử dụng để làm điều này.
Aleksi Torhamo

1

Có thể kích hoạt SSH và vô hiệu hóa SFTP trên toàn cầu và cho mỗi người dùng / nhóm.

Cá nhân tôi cần điều này bởi vì tôi muốn cấp quyền truy cập vào một số kho git qua SSH và tôi muốn vô hiệu hóa các hệ thống không cần thiết. Trong trường hợp đó SFTP là không cần thiết.

Toàn cầu

Bạn có thể tắt SFTP cho tất cả người dùng theo một số cách.

Hệ thống con bị thiếu

Trình nền SFTP được sử dụng bởi SSH có thể được cấu hình thông qua Subsystemtừ khóa. Từ sshd_config(5)hướng dẫn:

Subsystem
        Configures an external subsystem (e.g. file transfer daemon).
        Arguments should be a subsystem name and a command (with optional
        arguments) to execute upon subsystem request.

        The command sftp-server(8) implements the “sftp” file transfer
        subsystem.

        Alternately the name “internal-sftp” implements an in-process
        “sftp” server.  This may simplify configurations using
        ChrootDirectory to force a different filesystem root on clients.

        By default no subsystems are defined.

Dòng cuối cùng cho thấy rằng nó là đủ để không xác định bất kỳ hệ thống con nào cho "sftp".

Một lời nói dối sai lầm

Bạn cũng có thể vô hiệu hóa SFTP bằng cách đặt trình nền SFTP được SSH sử dụng thành thứ gì đó không sử dụng được. Ví dụ: định cấu hình hệ thống con "sftp" thành /bin/false:

Subsystem sftp /bin/false

Khi một cái gì đó sẽ cố gắng đăng nhập thông qua SFTP, trình nền SSH sẽ cố gắng sinh ra "sftp daemon" /bin/false. Các /bin/falsechương trình không chỉ có một điều, và đó là để trả lại một mã lỗi. Nỗ lực kết nối SFTP bị từ chối một cách hiệu quả.

Mỗi người dùng / nhóm

Cũng có thể vô hiệu hóa SFTP cho mỗi người dùng, nhóm hoặc một vài tiêu chí khác.

Điều này không hoạt động nếu bạn muốn người dùng của mình nhận được một dấu nhắc shell thông thường. Cũng không có nghĩa gì, vì bạn có thể phá vỡ hầu hết mọi thứ nếu bạn có quyền truy cập shell. Nó sẽ chỉ hoạt động nếu bạn chỉ muốn cấp quyền truy cập vào một chương trình cụ thể.

Phù hợp

Để khớp với nhóm người dùng, bạn có thể định cấu hình SSH với Matchtừ khóa. Từ sshd_config(5)hướng dẫn:

Match
        ...

        The arguments to Match are one or more criteria-pattern pairs or the
        single token All which matches all criteria.  The available criteria
        are User, Group, Host, LocalAddress, LocalPort, and Address.  The
        match patterns may consist of single entries or comma-separated
        lists and may use the wildcard and negation operators described in
        the PATTERNS section of ssh_config(5).

        ...

Một vài ví dụ:

  • Match User eva phù hợp với người dùng "eva"
  • Match User stephen,maria phù hợp với người dùng "stephen" và "maria"
  • Match Group wheel,adams,simpsons phù hợp với các nhóm "bánh xe", "adams", "simpsons"

Nếu bạn muốn biết thêm thông tin, có tải trong sshd_config(5)hướng dẫn.

Lệnh cưỡng bức

Thông thường, bạn nhận được vỏ đăng nhập của người dùng khi bạn kết nối qua SSH, nhưng SSH có thể được cấu hình để buộc một lệnh nhất định. Lệnh được buộc cho bất kỳ kết nối SSH nào, bao gồm SFTP, và do đó bạn có thể có tùy chọn để buộc lệnh bạn muốn.

Lệnh bắt buộc có thể được cấu hình với ForceCommandtừ khóa. Từ sshd_config(5)hướng dẫn:

ForceCommand
        Forces the execution of the command specified by ForceCommand,
        ignoring any command supplied by the client and ~/.ssh/rc if
        present.  The command is invoked by using the user's login shell
        with the -c option.  This applies to shell, command, or subsystem
        execution.  It is most useful inside a Match block.  The command
        originally supplied by the client is available in the
        SSH_ORIGINAL_COMMAND environment variable.  Specifying a command of
        “internal-sftp” will force the use of an in-process sftp server that
        requires no support files when used with ChrootDirectory.  The
        default is “none”.

Vì vậy, bạn có thể buộc lệnh bị ràng buộc mà bạn muốn sử dụng ForceCommand <your command>. Ví dụ:

Match User kim
        ForceCommand echo 'successful login man, congrats'

Thí dụ

Trong trường hợp tôi muốn cấp quyền truy cập git, tôi chỉ cần người dùng có quyền truy cập git-shell. Đây là phần vô hiệu hóa SFTP cho người dùng git của tôi, cùng với một số tùy chọn bảo mật:

Match Group git

        # have to do this instead of setting the login shell to `git-shell`,
        # to disable SFTP
        ForceCommand /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"

        # disable stuff we don't need
        AllowAgentForwarding no
        AllowTcpForwarding no
        AllowStreamLocalForwarding no
        PermitOpen none
        PermitTunnel no
        PermitTTY no
        X11Forwarding no

Trong trường hợp của tôi, tôi muốn chỉ cho phép truy cập MySQL (không cho phép cả truy cập SFTP và cửa sổ đầu cuối SSH) cho một khóa được ủy quyền cụ thể (nghĩa là không có thay đổi đối với tệp sshd_config). Tôi đã quản lý để thực hiện việc này với các tùy chọn ~ / .ssh / ủy quyền_key cho khóa cụ thể sau: lệnh = "/ usr / bin / echo 'Chỉ cho phép truy cập MySQL.' = "127.0.0.1:3306"
Martin_ATS
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.