1+ #[ cfg( unix) ]
2+ use std:: { fs:: Permissions , os:: unix:: fs:: PermissionsExt } ;
13use std:: {
24 io:: ErrorKind ,
35 net:: { IpAddr , Ipv4Addr , SocketAddr } ,
@@ -20,7 +22,7 @@ use axum_extra::extract::cookie::Key;
2022use clap:: crate_version;
2123use defguard_version:: { server:: DefguardVersionLayer , Version } ;
2224use serde:: Serialize ;
23- use tokio:: { net:: TcpListener , task:: JoinSet } ;
25+ use tokio:: { fs :: OpenOptions , io :: AsyncWriteExt , net:: TcpListener , task:: JoinSet } ;
2426use tower_governor:: {
2527 governor:: GovernorConfigBuilder , key_extractor:: SmartIpKeyExtractor , GovernorLayer ,
2628} ;
@@ -127,11 +129,8 @@ async fn core_version_middleware(
127129 }
128130
129131 let core_connected = app_state. grpc_server . connected . load ( Ordering :: Relaxed ) ;
130- let core_connected_header = if core_connected {
131- HeaderValue :: from_static ( "true" )
132- } else {
133- HeaderValue :: from_static ( "false" )
134- } ;
132+ let core_connected_header =
133+ HeaderValue :: from_static ( if core_connected { "true" } else { "false" } ) ;
135134
136135 response
137136 . headers_mut ( )
@@ -164,6 +163,8 @@ pub async fn run_setup(
164163 err. into ( )
165164 }
166165 } ) ?;
166+ #[ cfg( unix) ]
167+ tokio:: fs:: set_permissions ( cert_dir, Permissions :: from_mode ( 0o700 ) ) . await ?;
167168 }
168169
169170 // Only attempt setup if not already configured
@@ -189,9 +190,19 @@ pub async fn run_setup(
189190
190191 let cert_path = cert_dir. join ( GRPC_CERT_NAME ) ;
191192 let key_path = cert_dir. join ( GRPC_KEY_NAME ) ;
192- tokio:: fs:: write ( & cert_path, grpc_cert_pem)
193- . await
194- . map_err ( |err| {
193+ // Certificate and its key will be accessed only to this process's user.
194+ let mut options = OpenOptions :: new ( ) ;
195+ options. write ( true ) . create ( true ) . truncate ( true ) ;
196+ #[ cfg( unix) ]
197+ options. mode ( 0o600 ) ; // rw-------
198+
199+ // Write certificate to a file.
200+ options
201+ . clone ( )
202+ . open ( & cert_path)
203+ . await ?
204+ . write_all ( grpc_cert_pem. as_bytes ( ) )
205+ . await . map_err ( |err| {
195206 if err. kind ( ) == ErrorKind :: PermissionDenied {
196207 anyhow:: anyhow!(
197208 "Cannot write certificate file {}. Permission denied for certificate directory {}." ,
@@ -202,7 +213,11 @@ pub async fn run_setup(
202213 err. into ( )
203214 }
204215 } ) ?;
205- tokio:: fs:: write ( & key_path, grpc_key_pem)
216+ // Write key to a file.
217+ options
218+ . open ( & key_path)
219+ . await ?
220+ . write_all ( grpc_key_pem. as_bytes ( ) )
206221 . await
207222 . map_err ( |err| {
208223 if err. kind ( ) == ErrorKind :: PermissionDenied {
@@ -334,8 +349,8 @@ pub async fn run_server(
334349 // build application
335350 debug ! ( "Setting up API server" ) ;
336351 let shared_state = AppState {
337- cookie_key,
338352 grpc_server,
353+ cookie_key,
339354 } ;
340355
341356 // Setup tower_governor rate-limiter
0 commit comments