ssh-agent chuyển tiếp và sudo cho người dùng khác


153

Nếu tôi có máy chủ A để tôi có thể đăng nhập bằng khóa ssh của mình và tôi có khả năng "sudo su - otheruser", tôi sẽ mất chuyển tiếp khóa, vì các biến env bị loại bỏ người dùng ban đầu chỉ có thể đọc được ổ cắm. Có cách nào để tôi có thể chuyển tiếp khóa chuyển tiếp thông qua "sudo su - otheruser", vì vậy tôi có thể thực hiện công cụ trên máy chủ B bằng khóa được chuyển tiếp của mình (git clone và rsync trong trường hợp của tôi)?

Cách duy nhất tôi có thể nghĩ đến là thêm khóa của mình vào ủy quyền của người dùng khác và "ssh otheruser @ localhost", nhưng đó là điều khó thực hiện đối với mọi kết hợp người dùng và máy chủ mà tôi có thể có.

Nói ngắn gọn:

$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey). 

Câu trả lời:


182

Như bạn đã đề cập, các biến môi trường được loại bỏ bởi sudo, vì lý do bảo mật.

Nhưng may mắn thay sudolà khá cấu hình: bạn có thể nói chính xác biến môi trường nào bạn muốn giữ nhờ vào env_keeptùy chọn cấu hình /etc/sudoers.

Để chuyển tiếp đại lý, bạn cần giữ SSH_AUTH_SOCKbiến môi trường. Để làm như vậy, chỉ cần chỉnh sửa /etc/sudoerstệp cấu hình của bạn (luôn luôn sử dụng visudo) và đặt env_keeptùy chọn cho người dùng phù hợp. Nếu bạn muốn tùy chọn này được đặt cho tất cả người dùng, hãy sử dụng Defaultsdòng như thế này:

Defaults    env_keep+=SSH_AUTH_SOCK

man sudoers để biết thêm chi tiết.

Bây giờ bạn có thể làm một cái gì đó như thế này (với điều kiện user1của khóa công khai có mặt ở ~/.ssh/authorized_keystrong user1@serverAuser2@serverB, và serverA's /etc/sudoerstập tin được thiết lập như đã nêu ở trên):

user1@mymachine> eval `ssh-agent`  # starts ssh-agent
user1@mymachine> ssh-add           # add user1's key to agent (requires pwd)
user1@mymachine> ssh -A serverA    # no pwd required + agent forwarding activated
user1@serverA> sudo su - user2     # sudo keeps agent forwarding active :-)
user2@serverA> ssh serverB         # goto user2@serverB w/o typing pwd again...
user2@serverB>                     # ...because forwarding still works

1
Đây là câu trả lời đúng, nên được đánh dấu.
Xealot

41
Điều này chỉ hoạt động, nếu user2ở trên là root! Nếu không, user2sẽ có SSH_AUTH_SOCK được thiết lập chính xác, nhưng user2sẽ không thể truy cập ví dụ: / tmp / ssh-GjglIJ9337 /. rootkhông có quyền truy cập đó. Vì vậy, điều này có thể giải quyết một phần của vấn đề, nhưng không phải là OP: " ổ cắm chỉ có thể đọc được bởi người dùng ban đầu của tôi"
Peter V. Mørch

6
Defaults>root env_keep+=SSH_AUTH_SOCKNên chắc chắn nó chỉ chuyển tiếp khi sudoing để root. Bạn không muốn làm điều đó cho bất kỳ người dùng nào khác vì lý do bảo mật. Tốt hơn nên chạy một tác nhân ssh riêng cho người khác và thêm các phím thích hợp.
Paul Schyska

1
sudo su -không hoạt động đối với tôi, có lẽ nó không thể bảo vệ môi trường vì nó không sudoở thời điểm khởi động. sudo sudường như làm việc
Alex Fortuna

3
Tôi chưa bao giờ hiểu tại sao mọi người sử dụng sudo suanyway. Nếu bạn cần một vỏ gốc, đó là những gì sudo -shoặc sudo -ilà cho.
eaj

68
sudo -E -s
  • -E sẽ bảo vệ môi trường
  • -s chạy một lệnh, mặc định là shell

Điều này sẽ cung cấp cho bạn một vỏ gốc với các khóa gốc vẫn được tải.


2
Như với nhận xét ở trên, điều này chỉ giải quyết câu hỏi nếu bạn đang trở thành root, vì trong trường hợp đó, root có thể nhận được các quyền truy cập thông thường trên $ SSH_AUTH_SOCK.
doshea

35

Cho phép otheruser để truy cập $SSH_AUTH_SOCKtập tin và đó là thư mục, ví dụ bằng ACL đúng, trước khi chuyển sang họ. Ví dụ giả định Defaults:user env_keep += SSH_AUTH_SOCK/etc/sudoerstrên máy chủ:

$ ssh -A user@host
user@host$ setfacl -m otheruser:x   $(dirname "$SSH_AUTH_SOCK")
user@host$ setfacl -m otheruser:rwx "$SSH_AUTH_SOCK"
user@host$ sudo su - otheruser
otheruser@host$ ssh server
otheruser@server$

An toàn hơn và cũng hoạt động cho người dùng không root ;-)


6
Hãy nhớ khi sử dụng phương pháp này, những người khác đã đăng nhập vì otherusercũng có thể sử dụng xác thực ssh của bạn.
gitaarik

Điều này hoạt động với tôi ngoại trừ tôi phải thay đổi "sudo su - otheruser" thành "sudo su otheruser" (loại bỏ -).
Charles Finkel

1
Tại sao rwxvà không rw(hoặc rở tất cả)?
anatoly techtonik

3
@anatolytechtonik Từ man 7 unix- trên Linux kết nối với ổ cắm yêu cầu quyền đọc và ghi trên ổ cắm đó. Ngoài ra, bạn cần tìm kiếm (thực thi) và viết quyền trên thư mục nơi bạn tạo ổ cắm hoặc chỉ cho phép tìm kiếm (thực thi) khi bạn kết nối với ổ cắm này. Vì vậy, trong câu trả lời trên, thực thi quyền trên socket là dư thừa.
mixel 18/03/2017

thay vì phải chỉnh sửa / etc / sudoers bạn có thể sử dụngsudo -u otheruser --preserve-env=HOME -s
Sec

14

Tôi đã tìm thấy rằng điều này cũng hoạt động.

sudo su -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

Như những người khác đã lưu ý, điều này sẽ không hoạt động nếu người dùng mà bạn đang chuyển sang không có quyền đọc trên $ SSH_AUTH_SOCK (gần như bất kỳ người dùng nào ngoài root). Bạn có thể khắc phục điều này bằng cách đặt $ SSH_AUTH_SOCK và thư mục chứa trong đó để có quyền 777.

chmod 777 -R `dirname $SSH_AUTH_SOCK`
sudo su otheruser -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

Điều này là khá rủi ro mặc dù. Về cơ bản, bạn đang cấp cho mọi người dùng khác về quyền sử dụng hệ thống SSH (cho đến khi bạn đăng xuất). Bạn cũng có thể đặt nhóm và thay đổi quyền thành 770, điều này có thể an toàn hơn. Tuy nhiên, khi tôi cố gắng thay đổi nhóm, tôi đã nhận được "Hoạt động không được phép".


6
Điều này là vô cùng rủi ro. Cho phép mọi người dùng khác sử dụng tác nhân SSH của bạn tương đương với việc cung cấp cho họ tất cả thông tin đăng nhập của bạn (và nếu bạn đã từng sử dụng sudo hoặc su, cung cấp cho họ quyền lực gốc trên tất cả người dùng khác trên hệ thống, cũng như tất cả các hệ thống khác mà bạn sử dụng!) . Điều này KHÔNG BAO GIỜ được thực hiện!
Matija Nalis

4
Tôi không đồng ý với tuyên bố rằng "Điều này KHÔNG BAO GIỜ được thực hiện!" Có nhiều trường hợp rủi ro này được chấp nhận. Ví dụ: một nhóm nhỏ nơi mọi người đều có quyền như nhau và bạn tin tưởng tất cả những người dùng khác. Nó không bao giờ nên được thực hiện mà không hiểu những rủi ro nó liên quan. Nhưng một khi những rủi ro đó được hiểu, có những lúc rủi ro đó được chấp nhận.
phylae

6

Nếu bạn được ủy quyền sudo su - $USER, thì có lẽ bạn sẽ có một lý lẽ tốt để được phép ssh -AY $USER@localhostthay thế, với khóa công khai hợp lệ của bạn trong thư mục chính của $ USER. Sau đó, chuyển tiếp xác thực của bạn sẽ được thực hiện với bạn.


Ông đã đề cập rằng ở cuối câu hỏi của mình, và nói rằng nó sẽ khó thực hiện.
Fahad Sadah

Đây có lẽ là giải pháp tốt nhất nhưng sẽ có nhiều lông nếu $ USER là Người thật (tm) - họ có thể xóa khóa SA khỏi ủy quyền hoặc thay đổi mật khẩu của họ ...
voretaq7

Bạn có thể xóa quyền truy cập ghi của họ vào Author_keys (mặc dù nếu họ thực sự được thiết lập để từ chối quyền truy cập của họ, họ có thể xóa và tạo lại nó, nó nằm trong một thư mục họ sở hữu)
Fahad Sadah

4

Bạn luôn có thể chỉ ssh đến localhost với chuyển tiếp đại lý thay vì sử dụng sudo:

ssh -A otheruser@localhost

Nhược điểm là bạn cần đăng nhập lại, nhưng nếu bạn đang sử dụng nó trong tab màn hình / tmux, thì đó chỉ là một nỗ lực một lần, tuy nhiên, nếu bạn ngắt kết nối với máy chủ, tất nhiên ổ cắm sẽ bị hỏng . Vì vậy, sẽ không lý tưởng nếu bạn không thể mở phiên màn hình / tmux của mình mọi lúc (tuy nhiên, bạn có thể cập nhật thủ công SSH_AUTH_SOCKvar env của mình nếu bạn mát mẻ).

Cũng lưu ý rằng khi sử dụng chuyển tiếp ssh, root luôn có thể truy cập vào ổ cắm của bạn và sử dụng xác thực ssh của bạn (miễn là bạn đã đăng nhập bằng chuyển tiếp ssh). Vì vậy, hãy chắc chắn rằng bạn có thể tin tưởng root.


Điều này không hoạt động nếu bạn chỉ có quyền truy cập otheruserthông qua sudothay vì qua SSH (ví dụ: bạn muốn công cụ SCP như www-data)
Gert van den Berg

3

Đừng sử dụng sudo su - USER, nhưng thay vào đó sudo -i -u USER. Làm việc cho tôi!


Bạn có phiên bản sudo nào? Của tôi (1.6.7p5, CentOS 4.8) không có -i trong trang người dùng của nó.
David Mackffy

Sudo version 1.6.9p17chạy trên Debian Lenny. Thử sudo -schưa?
Fahad Sadah

6
Không làm việc cho tôi.

Trên Ubuntu, sử dụng Sudo 1.8.9p5, tôi sudo -scũng không sudo -ilàm việc ...
Jon L.

2

Kết hợp thông tin từ các câu trả lời khác tôi đã đưa ra điều này:

user=app
setfacl -m $user:x $(dirname "$SSH_AUTH_SOCK")
setfacl -m $user:rwx "$SSH_AUTH_SOCK"
sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" -u $user -i

Tôi thích điều này bởi vì tôi không cần phải chỉnh sửa sudoerstập tin.

Đã thử nghiệm trên Ubuntu 14.04 (phải cài đặt aclgói).


1

Tôi nghĩ rằng có một vấn đề với -tùy chọn (dấu gạch ngang) sau sutrong lệnh của bạn:

sudo su - otheruser

Nếu bạn đọc trang man của su , bạn có thể thấy rằng tùy chọn -, -l, --loginbắt đầu môi trường shell là shell đăng nhập. Đây sẽ là môi trường cho otheruserbất kể các biến env nơi bạn chạy su.

Nói một cách đơn giản, dấu gạch ngang sẽ làm suy yếu bất cứ thứ gì bạn truyền từ sudo.

Thay vào đó, bạn nên thử lệnh này:

sudo -E su otheruser

Như @ joao-costa đã chỉ ra, -Esẽ bảo toàn tất cả các biến trong môi trường nơi bạn chạy sudo. Sau đó không có dấu gạch ngang, susẽ sử dụng môi trường đó trực tiếp.


0

Thật không may khi bạn kiện người dùng khác (hoặc thậm chí sử dụng sudo) bạn sẽ mất khả năng sử dụng các phím được chuyển tiếp của mình. Đây là một tính năng bảo mật: Bạn không muốn người dùng ngẫu nhiên kết nối với đại lý ssh của bạn và sử dụng các khóa của bạn :)

Phương thức "ssh -Ay $ {USER} @localhost" hơi cồng kềnh (và như đã lưu ý trong nhận xét của tôi về câu trả lời của David dễ bị phá vỡ), nhưng có lẽ đó là cách tốt nhất bạn có thể làm.


1
Hmm, nhưng nếu tôi làm điều này với ssh, thì dù sao thì người đại diện của tôi cũng có thể truy cập được đại lý của tôi, hay tôi sai?

Nếu bạn SSH vào người dùng đích với tác nhân chuyển tiếp các yêu cầu đại lý của bạn sẽ đưa chuỗi lên bất cứ nơi nào có tác nhân "thực". Khi bạn su hoặc sudo ra khỏi người dùng ban đầu, ổ cắm tác nhân SSH của bạn sẽ không thể truy cập (hoặc không nên) - Thư mục mà nó sống ở chế độ 700 & thuộc sở hữu của người dùng ban đầu. (Caveat rõ ràng: Nếu bạn đang chuyển sang root & đặt lại môi trường SSH_AUTH_SOCK thì nó có thể hoạt động, nhưng tôi sẽ không dựa vào nó)
voretaq7

1
Trên máy chủ của tôi (Ubuntu 12.04, phiên bản ssh OpenSSH_5.9p1 Debian-5ubfox1.1, OpenSSL 1.0.1 14 tháng 3 năm 2012), ssh có -a-Ađối số. -akhông hoàn toàn ngược lại với những gì dự định, nó vô hiệu hóa chuyển tiếp đại lý! Vì vậy, trong phiên bản gần đây (và có thể là tất cả) của Ubuntu, hãy sử dụng -Ađể cho phép chuyển tiếp tác nhân.
knite

@knite Bạn đã đúng - đó là một lỗi đánh máy (3 tuổi!) trong câu trả lời của tôi. Đã sửa ngay bây giờ :-)
voretaq7
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.