| 1 | \subsection{AFS} | 
|---|
| 2 |  | 
|---|
| 3 | \begin{frame} | 
|---|
| 4 | \frametitle{AFS access controls} | 
|---|
| 5 | \begin{itemize} | 
|---|
| 6 | \item AFS enforces server side access controls. | 
|---|
| 7 | \item On Athena systems: user's password $\to$ Kerberos tickets | 
|---|
| 8 | $\to$ AFS tokens, which authenticate the client to the AFS server. | 
|---|
| 9 | \item On scripts, we don't have the user's password or tickets. | 
|---|
| 10 | \item User's scripts are not publicly readable. | 
|---|
| 11 | \item Access is controlled through a single {\tt daemon.scripts} AFS | 
|---|
| 12 | user. | 
|---|
| 13 | \end{itemize} | 
|---|
| 14 | \end{frame} | 
|---|
| 15 |  | 
|---|
| 16 | \begin{frame} | 
|---|
| 17 | \frametitle{Isolating users on scripts} | 
|---|
| 18 | \begin{itemize} | 
|---|
| 19 | \item If all users share {\tt daemon.scripts} AFS tokens, how are | 
|---|
| 20 | they prevented from accessing each other's {\tt web\_scripts}? | 
|---|
| 21 | \item On scripts, we enforce additional restrictions in the AFS | 
|---|
| 22 | kernel module. | 
|---|
| 23 | \begin{itemize} | 
|---|
| 24 | \item \texttt{afsAccessOK()} in | 
|---|
| 25 | \texttt{openafs/src/afs/VNOPS/afs\_vnop\_access.c} | 
|---|
| 26 | \end{itemize} | 
|---|
| 27 | \end{itemize} | 
|---|
| 28 | \end{frame} | 
|---|
| 29 |  | 
|---|
| 30 | \begin{frame}[fragile] | 
|---|
| 31 | \only<1>{You can only use {\tt daemon.scripts} credentials to access | 
|---|
| 32 | files in a volume with volume ID equal to your UID,}% | 
|---|
| 33 | \only<2>{or the file is {\tt system:anyuser} readable | 
|---|
| 34 | anyway,\vspace{\baselineskip}}% | 
|---|
| 35 | \only<3>{or the {\tt apache} or {\tt postfix} users are doing a {\tt | 
|---|
| 36 | stat()},\vspace{\baselineskip}}% | 
|---|
| 37 | \only<4>{or the {\tt apache} user is trying to read a file with mode | 
|---|
| 38 | {\tt 777},\vspace{\baselineskip}}% | 
|---|
| 39 | \only<5>{or the {\tt root} or {\tt signup} users are accessing file | 
|---|
| 40 | with the special {\tt D} or {\tt E} bits.}% | 
|---|
| 41 |  | 
|---|
| 42 | \begin{footnotesize} | 
|---|
| 43 | \begin{semiverbatim} | 
|---|
| 44 | int | 
|---|
| 45 | afs_AccessOK(struct vcache *avc, afs_int32 arights, | 
|---|
| 46 | struct vrequest *areq, afs_int32 check_mode_bits) | 
|---|
| 47 | \{ | 
|---|
| 48 | \ldots | 
|---|
| 49 | +    if (\alert<1>{!(areq->realuid == avc->fid.Fid.Volume)} && | 
|---|
| 50 | +        \alert<2>{!((avc->anyAccess | arights) == avc->anyAccess)} && | 
|---|
| 51 | +        \alert<3>{!(arights == PRSFS_LOOKUP && areq->realuid == HTTPD_UID) &&} | 
|---|
| 52 | +        \alert<3>{!(arights == PRSFS_LOOKUP && areq->realuid == POSTFIX_UID)} && | 
|---|
| 53 | +        \alert<4>{!(arights == PRSFS_READ && areq->realuid == HTTPD_UID &&} | 
|---|
| 54 | +        \alert<4>{  avc->m.Mode == 0100777)} && | 
|---|
| 55 | +        \alert<5>{!(PRSFS_USR3 == afs_GetAccessBits(avc, PRSFS_USR3, areq) &&} | 
|---|
| 56 | +        \alert<5>{  areq->realuid == 0) &&} | 
|---|
| 57 | +        \alert<5>{!(PRSFS_USR4 == afs_GetAccessBits(avc, PRSFS_USR4, areq) &&} | 
|---|
| 58 | +        \alert<5>{  (areq->realuid == 0 || areq->realuid == SIGNUP_UID))}) \{ | 
|---|
| 59 | +       return 0; | 
|---|
| 60 | +    \} | 
|---|
| 61 | \ldots | 
|---|
| 62 | \end{semiverbatim} | 
|---|
| 63 | \end{footnotesize} | 
|---|
| 64 | \end{frame} | 
|---|
| 65 |  | 
|---|