![让 rundeck 在端口 80 上运行](https://linux22.com/image/675105/%E8%AE%A9%20rundeck%20%E5%9C%A8%E7%AB%AF%E5%8F%A3%2080%20%E4%B8%8A%E8%BF%90%E8%A1%8C.png)
默认情况下,rundeck 在端口 4440/4443 上运行。现在,出于显而易见的安全原因,我不希望将此敏感服务绑定到高编号端口。一旦设置了 HTTPS,这应该会减轻我的一些担忧,但仍然...
有没有办法让 rundeckd 服务以 root 身份绑定到端口 80,然后再下放到 rundeck 用户?
非常明确地说,我不是问“我怎样才能让 rundeck 在不同的端口?”,因为我可以修改/etc/rundeck/profile
它并使其在任何未注册的端口上运行。
答案1
有没有办法让 rundeckd 服务以 root 身份绑定到端口 80,然后再下放到 rundeck 用户?
据我所知,没有现成的解决方案。对于您想要实现的目标,程序应该使用特权分离:
在计算机编程和计算机安全中,特权分离是一种将程序划分为多个部分的技术,每个部分仅限于执行特定任务所需的特定特权。这用于减轻计算机安全攻击的潜在损害。
实现特权分离的常用方法是将计算机程序分成两个进程。主程序放弃特权,而较小的程序保留特权以执行某项任务。然后,这两个部分通过套接字对进行通信。因此,即使这对程序能够执行特权操作,任何针对较大程序的成功攻击都将获得最小的访问权限。
特权分离传统上是通过使用 POSIX 指定的 setuid(2)/setgid(2) 和相关系统调用来区分实际用户 ID/组 ID 与有效用户 ID/组 ID 来实现的。如果这些设置不正确,漏洞可能会导致大范围的网络渗透。
如上所述,进程可以调用设置用户标识 (2), 和设置gid(2)以 root 身份启动后删除特权。
如果您真的非常迫切地希望实现这一切,您可能需要对 rundeck 代码进行根本性的更改。
请参见 :Linux 守护进程如何以及为何放弃特权和
https://unix.stackexchange.com/questions/21282/drop-process-privileges
或者你可以使用授权绑定允许非root程序bind()到较低的端口。
并根据绑定到另一个端口Rundeck 安装指南:系统属性其中包括:
您可以使用一些 Java 系统属性来定制启动器行为。
使用命令的常规
-Dproperty=value
命令行选项指定这些属性java
:server.http.port The HTTP port to use for the server, default "4440" server.https.port The HTTPS port to use or the server, default "4443"
答案2
一种经典方法是设置 nginx 代理。在 ubuntu 和大多数 Linux 版本上,安装 nginx 包并将配置文件放入 /etc/nginx/sites-available。我的文件如下所示:
server {
listen 443;
ssl_certificate /etc/nginx/my_domain.crt;
ssl_certificate_key /etc/nginx/my_domain.key;
# Limit to VPN
allow 10.1.0.0/16;
deny all;
ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
add_header X-Frame-Options "SAMEORIGIN";
add_header Content-Security-Policy "frame-ancestors 'self'";
location / {
proxy_pass http://localhost:4440;
proxy_read_timeout 90;
}
}
然后在 /etc/nginx/sites-enabled/ 中创建指向 /etc/nginx/sites-available/rundeck 的符号链接并重新启动。显然,类似 haproxy 的软件包可以为您做同样的事情。
答案3
如果您使用的是 AWS,另一种方法是使用应用程序负载均衡器 (ALB) 为您代理。这样,您在实例上进行的任何更新/配置更改都不会影响这一点;您将代理与服务器操作系统分离。这应该可以缓解 OP 在 Karl DeBisschop 的评论下的评论中的担忧。
完整文档这里,但概述如下:
配置 ALB。这将包括配置您的“侦听器”,它将“侦听”从外部(例如客户端)发往端口 80 的流量,还将包括配置您的“目标组”,它将“侦听”从您的 ALB 侦听器发往端口 4440 的流量。
流程如下:客户端请求 80 -> 监听器接收请求 -> 监听器将请求“转发”到目标组 -> EC2 实例在端口 4440 上接收
--
请注意,您必须手动或通过自动扩展组配置将 EC2 注册到目标组。如果注册后出现 302 健康检查错误,这仅表示您的健康检查路径错误。纠正此问题的快速方法是执行...
curl -vL <your URL destination>
输出应显示您的 302 重定向以及 200 响应(假设您的 Web 应用程序运行正常)。找到 302 重定向响应下的路径,并将其粘贴到目标组健康检查路径中:
> GET / HTTP/1.1
> Host: XXXXXXXXX.us-east-1.elb.amazonaws.com
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 302 Found
< Date: Wed, 11 Mar 2020 18:19:57 GMT
< Content-Length: 0
< Connection: keep-alive
< Set-Cookie: JSESSIONID=XXXXXXXXXX; Path=/; HttpOnly
< Expires: Thu, 01 Jan 1970 00:00:00 GMT
< Location: http://XXXXXXXXX.us-east-1.elb.amazonaws.com/user/login
<
* Connection #0 to host XXXXXXXXX.us-east-1.elb.amazonaws.com left intact
* Issue another request to this URL: 'http://XXXXXXXXX.us-east-1.elb.amazonaws.com/user/login'
[omitted]
* Connected to XXXXXXXXX.us-east-1.elb.amazonaws.com (10.1.1.1) port 80 (#0)
> GET /user/login HTTP/1.1 <-------------- this path is what you want