SSH 权限被拒绝:在我的 Flask 应用程序中使用 paramiko 模块并使用 mod_wsgi(Apache) 模式部署相同的模块
SSH permission denied : using paramiko module inside my flask app and deployed same using mod_wsgi(Apache) mode
配置文件(PetInit.conf):
WSGISocketPrefix run/wsgi
<VirtualHost *:80>
ServerName xx.xx.xx.xxx
WSGIScriptAlias / /usr/share/PetInit/PetInit.wsgi
WSGIDaemonProcess PetInit group=root threads=5 home=/usr/share
<Directory /usr/share/PetInit>
WSGIScriptReloading On
WSGIProcessGroup PetInit
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
wsgi 文件(PetInit.wsgi):
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.append("/usr/local/lib/python2.7/site-packages")
sys.path.append("/usr/local/lib/python2.7/site-packages/PetInit")
from PetInitServer import app as application
应用程序(服务器)代码:
import paramiko
from paramiko import SSHClient
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(remotenodeip,username='root', password='*****',key_filename='/root/.ssh/id_rsa.pub')
服务器日志:
[Tue Oct 03 05:39:45 2017] [error] ssh.connect(ip,username='root', password='*****',key_filename='/root/.ssh/id_rsa.pub')
[Tue Oct 03 05:39:45 2017] [error] File "/usr/lib/python2.6/site-packages/paramiko/client.py", line 290, in connect
[Tue Oct 03 05:39:45 2017] [error] sock.connect(addr)
[Tue Oct 03 05:39:45 2017] [error] File "<string>", line 1, in connect
[Tue Oct 03 05:39:45 2017] [error] error: [Errno 13] Permission denied
注:
如果我在端口 5000(没有 mod_wsgi)上启动我的烧瓶应用程序,则 ssh 没有问题。所以我怀疑 Wsgidaemon 进程没有权限。如何授予 wsgidaemon 进程权限或任何其他方式来解决此问题??
您在 Apache 下的代码将 运行 作为特殊的 Apache 用户,它通常无法访问文件 /root/.ssh/id_rsa.pub
。此外,由于 /root/.ssh
目录只能由用户 root
访问,并且通常不能通过组访问权限设置 group
对于 WSGIDaemonProcess
到 root
可能还不够。 运行:
ls -lasd /root/.ssh
并检查目录权限。如果是这样的:
0 drwx------ 11 root root 374 28 Aug 13:02 .
然后无法通过组访问。
您不一定要添加组访问权限,因为我认为工具将不会接受其中的内容,因为它们可能会验证权限。
因为只是public密钥,不是私钥,那你复制到可以访问的地方就可以了。
您可能希望 运行 守护进程模式进程组作为一个全新的用户而不是 Apache 用户,只有那个新用户能够访问 public 键。
终于找到了解决方案并且工作正常。 httpd_can_network_connect 参数在我的 Linux 系统中受到限制。
要检查 "httpd_can_network_connect" 值,运行 以下命令:
/usr/sbin/getsebool -a | grep "httpd_can_network_connect"
如果输出如下:
httpd_can_network_connect --> 关闭
然后将值设置为开。
setsebool -P httpd_can_network_connect on
配置文件(PetInit.conf):
WSGISocketPrefix run/wsgi
<VirtualHost *:80>
ServerName xx.xx.xx.xxx
WSGIScriptAlias / /usr/share/PetInit/PetInit.wsgi
WSGIDaemonProcess PetInit group=root threads=5 home=/usr/share
<Directory /usr/share/PetInit>
WSGIScriptReloading On
WSGIProcessGroup PetInit
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
wsgi 文件(PetInit.wsgi):
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.append("/usr/local/lib/python2.7/site-packages")
sys.path.append("/usr/local/lib/python2.7/site-packages/PetInit")
from PetInitServer import app as application
应用程序(服务器)代码:
import paramiko
from paramiko import SSHClient
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(remotenodeip,username='root', password='*****',key_filename='/root/.ssh/id_rsa.pub')
服务器日志:
[Tue Oct 03 05:39:45 2017] [error] ssh.connect(ip,username='root', password='*****',key_filename='/root/.ssh/id_rsa.pub')
[Tue Oct 03 05:39:45 2017] [error] File "/usr/lib/python2.6/site-packages/paramiko/client.py", line 290, in connect
[Tue Oct 03 05:39:45 2017] [error] sock.connect(addr)
[Tue Oct 03 05:39:45 2017] [error] File "<string>", line 1, in connect
[Tue Oct 03 05:39:45 2017] [error] error: [Errno 13] Permission denied
注: 如果我在端口 5000(没有 mod_wsgi)上启动我的烧瓶应用程序,则 ssh 没有问题。所以我怀疑 Wsgidaemon 进程没有权限。如何授予 wsgidaemon 进程权限或任何其他方式来解决此问题??
您在 Apache 下的代码将 运行 作为特殊的 Apache 用户,它通常无法访问文件 /root/.ssh/id_rsa.pub
。此外,由于 /root/.ssh
目录只能由用户 root
访问,并且通常不能通过组访问权限设置 group
对于 WSGIDaemonProcess
到 root
可能还不够。 运行:
ls -lasd /root/.ssh
并检查目录权限。如果是这样的:
0 drwx------ 11 root root 374 28 Aug 13:02 .
然后无法通过组访问。
您不一定要添加组访问权限,因为我认为工具将不会接受其中的内容,因为它们可能会验证权限。
因为只是public密钥,不是私钥,那你复制到可以访问的地方就可以了。
您可能希望 运行 守护进程模式进程组作为一个全新的用户而不是 Apache 用户,只有那个新用户能够访问 public 键。
终于找到了解决方案并且工作正常。 httpd_can_network_connect 参数在我的 Linux 系统中受到限制。
要检查 "httpd_can_network_connect" 值,运行 以下命令:
/usr/sbin/getsebool -a | grep "httpd_can_network_connect"
如果输出如下:
httpd_can_network_connect --> 关闭
然后将值设置为开。
setsebool -P httpd_can_network_connect on