デフォルトでは、rundeckはポート4440/4443で実行されます。セキュリティ上の理由から、この機密性の高いサービスを多数のポートにバインドする必要はありません。 HTTPSが設定されると、それは私の懸念のいくつかを改善するはずですが、それでも...
Rundeckdサービスをrootとしてポート80にバインドしてから、rundeckユーザーにドロップダウンする方法はありますか?
十分に明確にするために、私はnot「rundeckをdifferentport? "、/etc/rundeck/profile
を変更して、登録されていないポートで問題なく実行できるためです。
Rundeckdサービスをrootとしてポート80にバインドしてから、rundeckユーザーにドロップダウンする方法はありますか?
私が見る限り、これに対するすぐに使える解決策はありません。あなたが達成したいことのために、プログラムは使用する必要があります 特権分離 :
コンピュータプログラミングとコンピュータセキュリティでは、特権の分離は、プログラムを特定のタスクを実行するために必要な特定の特権に制限された部分に分割する手法です。これは、コンピュータのセキュリティ攻撃による潜在的な被害を軽減するために使用されます。
特権の分離を実装する一般的な方法は、コンピュータープログラムを2つのプロセスに分岐させることです。メインプログラムは特権を削除し、小さいプログラムは特定のタスクを実行するために特権を保持します。次に、2つの半分はソケットペアを介して通信します。したがって、プログラムのペアが特権操作を実行できる場合でも、より大きなプログラムに対する攻撃が成功すると、アクセスは最小限に抑えられます。
特権の分離は、従来、POSIXで指定されたsetuid(2)/ setgid(2)および関連するシステムコールを使用して、実際のユーザーID /グループIDを実効ユーザーID /グループIDから区別することによって実現されていました。これらが正しく配置されていない場合、ギャップによってネットワークが広範囲に浸透する可能性があります。
上記のように、プロセスは setuid(2) および setgid(2) を呼び出して、rootとして開始した後に特権を削除できます。
そして、これがすべて機能するためには、もしあなたが必死なら、rundeckコードに根本的な変更を加える必要があるでしょう。
参照してください: Linuxデーモンが特権をドロップする方法と理由 および
https://unix.stackexchange.com/questions/21282/drop-process-privileges
または、 authbind を使用して、root以外のプログラムがより低いポートにbind()できるようにすることもできます。
そして、 Rundeckインストールガイド:システムプロパティ に従って別のポートにバインドする場合:
いくつかのJavaシステムプロパティを使用して、ランチャーの動作をカスタマイズできます。
Java
コマンドの通常の-Dproperty=value
コマンドラインオプションを使用してこれらのプロパティを指定します。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"
古典的なアプローチの1つは、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のような同様のパッケージがあなたのために同じことをすることができます。
AWSを使用している場合、別のアプローチは、Application Load Balancer(ALB)を使用してプロキシすることです。このように、インスタンスで行った更新/構成の変更はこれに影響しません。プロキシをサーバーOSから切り離しています。これは、KarlDeBisschopのコメントの下での彼のコメントにおけるOPの懸念を軽減するはずです。
完全なドキュメント ここ ですが、概要は次のとおりです。
ALBを構成します。これには、外部(クライアントなど)からポート80宛てのトラフィックを「リッスン」する「リスナー」の構成が含まれ、ポート4440宛てのトラフィックを「リッスン」する「ターゲットグループ」の構成も含まれます。 ALBのリスナーから。
フローは次のとおりです。クライアントリクエスト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