[英]Generating SSH keys for 'apache' user
如何在Linux中為'apache'用戶添加SSH密鑰?
背景
我試圖向github添加服務掛鈎,以便在我推送到我的倉庫后通知URL。 我有以下php頁面設置:
<?php `git pull origin master`;
但是我得到以下輸出:
sh: git: Permission denied
這是因為我為github訪問生成的密鑰是由我的“root”用戶生成的。 但是,當我從php中執行命令時,運行它的是'apache'用戶。
因此,密鑰不對應,並且拒絕許可。
由於我無法從終端切換用戶生成密鑰為'apache',我不太清楚該怎么做。 誰有人建議解決方案?
您可能必須在apache用戶的.ssh目錄中復制根生成的密鑰。
假設apache的homedir是/ var / www (檢查/ etc / passwd),並且命名密鑰是id_rsa-git :
mkdir -p /var/www/.ssh/
cp /root/.ssh/id_rsa-git /var/www/.ssh/id_rsa
無需復制公鑰。
注意:默認情況下,使用的密鑰是id_rsa或id_dsa 。 您可以更改復制密鑰的名稱以與此匹配。
您還可以更改id_rsa密鑰和.ssh目錄的所有權:
chown -R apache:apache /var/www/.ssh
chmod 0700 /var/www/.ssh
chmod 0600 /var/www/.ssh/id_rsa
因為你是root用戶,你可以試試sudo -u apache ssh-keygen -t rsa
只需在yvan的回答下發布@KitCarrau的評論,這對我有用
sudo -u apache ssh-keygen -t rsa
對於debian
sudo -u www-data ssh-keygen -t rsa
在此之后單擊Enter兩次,以跳過密碼
另外,它建議在/var/www/.ssh
目錄中創建公鑰/私鑰,即使我在/home/my_user/www
有我的www /home/my_user/www
,也沒關系。
現有答案要么不完整,要么不安全。 如果將.ssh
目錄放入apache用戶( /var/www
)的主目錄中,那么這也很可能會提供該目錄的內容,從而將您的ssh私鑰暴露給公共Web。 為了防止這種情況,您必須配置apache 不要為.ssh
目錄提供服務,但現有的答案都沒有解釋如何執行此操作。
我還認為將.ssh
目錄設置為公開服務的www-root的子目錄仍然很危險,因為即使您向apache配置添加規則,升級服務器或執行不相關的其他配置也可能會覆蓋此規則沒有你注意到。
所以這里有一個答案,將密鑰放在別處,默認情況下不由apache提供。 甚至沒有必要成為www-data
用戶,因為其他人正在努力。
首先,找出我們的apache用戶的主目錄,例如查看/etc/passwd
並查找www-data
用戶,或者調用您的發行版的apache用戶。 主目錄可能是/var/www
。
然后運行(用你的設置上的apache用戶的主目錄替換/var/www
):
$ mkdir "$HOME/www-data.ssh"
$ ssh-keygen -q -t rsa -f "$HOME/www-data.ssh/id_rsa" -N ""
$ chown -R www-data:www-data "$HOME/www-data.ssh"
$ mkdir /var/www/.ssh
$ cat << END > /var/www/.ssh/config
> Host *
> IdentityFile $HOME/www-data.ssh/id_rsa
> END
$ chown -R www-data:www-data /var/www/.ssh
現在,您的www-data
用戶將使用$HOME/www-data.ssh/id_rsa
的ssh密鑰進行所有ssh連接,並且因為您的$HOME
可能與/var/www
,所以該目錄將不會被提供。 因此,即使沒有向apache添加任何自定義規則,用戶也可以看到你的.ssh/config
但他們將無法訪問它指向的私鑰。 不過,您的www-data
用戶將知道如何操作。
我遇到了類似的問題,還有一個額外的問題。 為了使用apache用戶進行ssh,您還需要編輯/etc/passwd
文件,以便apache的指令定義了shell。
就我而言,我需要改變
apache:x:48:48:Apache:/var/www:/sbin/nologin
至
apache:x:48:48:Apache:/var/www:/bin/bash
要添加到@Vincent,如果啟用了SELinux,則必須為新的.ssh文件夾設置上下文。
在RHEL上,將以下內容添加到此文件:/etc/selinux/targeted/contexts/files/file_contexts.homedirs
/var/www/[^/]*/.+ system_u:object_r:user_home_t:s0
/var/www/[^/]*/\.ssh(/.*)? system_u:object_r:ssh_home_t:s0
然后運行命令
# restorcon -Rv /var/www/
我不知道這是否適用於redhat(我假設你正在運行)然而,我能夠通過執行以下操作來su-www-data(apache用戶為debian):
sudo su www-data
它確實起了聳聳肩的作用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.