Skip to content

Commit 0de3b67

Browse files
authored
Merge pull request #627 from Dstack-TEE/feat/remoteendpoint-unix-peer
ra-rpc: populate Unix peer creds for UDS endpoints
2 parents 01c26b7 + ee54e4b commit 0de3b67

File tree

3 files changed

+292
-21
lines changed

3 files changed

+292
-21
lines changed

guest-agent/src/server.rs

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ use crate::http_routes;
1010
use crate::rpc_service::{AppState, ExternalRpcHandler, InternalRpcHandler, InternalRpcHandlerV0};
1111
use crate::socket_activation::{ActivatedSockets, ActivatedUnixListener};
1212
use anyhow::{anyhow, Context, Result};
13+
use ra_rpc::rocket_helper::UnixPeerCredListener;
1314
use rocket::{
1415
fairing::AdHoc,
1516
figment::Figment,
16-
listener::{Bind, DefaultListener},
17+
listener::{unix::UnixListener, Bind, DefaultListener, Endpoint},
1718
};
1819
use rocket_vsock_listener::VsockListener;
1920
use sd_notify::{notify as sd_notify, NotifyState};
@@ -43,7 +44,7 @@ async fn run_internal_v0(
4344

4445
if let Some(std_listener) = activated_socket {
4546
info!("Using systemd-activated socket for tappd.sock");
46-
let listener = ActivatedUnixListener::new(std_listener)?;
47+
let listener = UnixPeerCredListener::new(ActivatedUnixListener::new(std_listener)?);
4748
sock_ready_tx.send(()).ok();
4849
ignite
4950
.launch_on(listener)
@@ -52,14 +53,29 @@ async fn run_internal_v0(
5253
} else {
5354
let endpoint = DefaultListener::bind_endpoint(&ignite)
5455
.map_err(|err| anyhow!("Failed to get endpoint: {err}"))?;
55-
let listener = DefaultListener::bind(&ignite)
56-
.await
57-
.map_err(|err| anyhow!("Failed to bind on {endpoint}: {err}"))?;
5856
sock_ready_tx.send(()).ok();
59-
ignite
60-
.launch_on(listener)
61-
.await
62-
.map_err(|err| anyhow!(err.to_string()))?;
57+
match endpoint {
58+
Endpoint::Unix(_) => {
59+
let listener = UnixPeerCredListener::new(
60+
<UnixListener as Bind>::bind(&ignite)
61+
.await
62+
.map_err(|err| anyhow!("Failed to bind on {endpoint}: {err}"))?,
63+
);
64+
ignite
65+
.launch_on(listener)
66+
.await
67+
.map_err(|err| anyhow!(err.to_string()))?;
68+
}
69+
_ => {
70+
let listener = DefaultListener::bind(&ignite)
71+
.await
72+
.map_err(|err| anyhow!("Failed to bind on {endpoint}: {err}"))?;
73+
ignite
74+
.launch_on(listener)
75+
.await
76+
.map_err(|err| anyhow!(err.to_string()))?;
77+
}
78+
}
6379
}
6480
Ok(())
6581
}
@@ -80,7 +96,7 @@ async fn run_internal(
8096

8197
if let Some(std_listener) = activated_socket {
8298
info!("Using systemd-activated socket for dstack.sock");
83-
let listener = ActivatedUnixListener::new(std_listener)?;
99+
let listener = UnixPeerCredListener::new(ActivatedUnixListener::new(std_listener)?);
84100
sock_ready_tx.send(()).ok();
85101
ignite
86102
.launch_on(listener)
@@ -89,14 +105,29 @@ async fn run_internal(
89105
} else {
90106
let endpoint = DefaultListener::bind_endpoint(&ignite)
91107
.map_err(|err| anyhow!("Failed to get endpoint: {err}"))?;
92-
let listener = DefaultListener::bind(&ignite)
93-
.await
94-
.map_err(|err| anyhow!("Failed to bind on {endpoint}: {err}"))?;
95108
sock_ready_tx.send(()).ok();
96-
ignite
97-
.launch_on(listener)
98-
.await
99-
.map_err(|err| anyhow!(err.to_string()))?;
109+
match endpoint {
110+
Endpoint::Unix(_) => {
111+
let listener = UnixPeerCredListener::new(
112+
<UnixListener as Bind>::bind(&ignite)
113+
.await
114+
.map_err(|err| anyhow!("Failed to bind on {endpoint}: {err}"))?,
115+
);
116+
ignite
117+
.launch_on(listener)
118+
.await
119+
.map_err(|err| anyhow!(err.to_string()))?;
120+
}
121+
_ => {
122+
let listener = DefaultListener::bind(&ignite)
123+
.await
124+
.map_err(|err| anyhow!("Failed to bind on {endpoint}: {err}"))?;
125+
ignite
126+
.launch_on(listener)
127+
.await
128+
.map_err(|err| anyhow!(err.to_string()))?;
129+
}
130+
}
100131
}
101132
Ok(())
102133
}

ra-rpc/src/lib.rs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,31 @@ pub mod client;
2222
#[cfg(feature = "openapi")]
2323
pub mod openapi;
2424

25+
#[derive(Debug, Clone, PartialEq, Eq)]
26+
pub struct UnixPeerCred {
27+
/// Peer process ID (platform-independent representation)
28+
pub pid: u64,
29+
/// Peer user ID
30+
pub uid: u64,
31+
/// Peer group ID
32+
pub gid: u64,
33+
}
34+
2535
#[derive(Debug, Clone, PartialEq, Eq)]
2636
pub enum RemoteEndpoint {
2737
Tcp(SocketAddr),
2838
Quic(SocketAddr),
29-
Unix(PathBuf),
30-
Vsock { cid: u32, port: u32 },
39+
/// Unix domain socket endpoint.
40+
///
41+
/// When available, `peer` can carry SO_PEERCRED (pid/uid/gid) of the caller.
42+
Unix {
43+
path: PathBuf,
44+
peer: Option<UnixPeerCred>,
45+
},
46+
Vsock {
47+
cid: u32,
48+
port: u32,
49+
},
3150
Other(String),
3251
}
3352

0 commit comments

Comments
 (0)