Files
SSW590-DevOps/devopsPasswords.tex
T

70 lines
3.8 KiB
TeX

\chapter{Passwords}
\ChapterLabel{Passwords}
\index{passwords}
\index{passwords!policy}
\index{passwords!derivation rule}
\index{credentials}
\index{least privilege}
\section{Purpose}
This chapter records the accounts that will exist in the development
environment described in \ChapterRef{Hosts} and the rule governing the password
for each. No password appears here. Where a password is derived by rule, the
register records the hint needed to reconstruct it rather than its value; where
a password is machine-generated, the register records where it is stored rather
than what it is.
\section{Password Classes}
\index{passwords!classes}
Accounts fall into two classes, distinguished by whether the secret has to be
recalled from memory.
\begin{itemize}[leftmargin=*]
\item \textbf{Generated.} The secret is produced at random by a password
manager, is unique to the account, and is never typed from memory. This
class is preferred, and every account that can use it does.
\item \textbf{Derived.} The secret is constructed in the register.
This class is reserved for the small number of secrets that must
be entered when the password manager is not available.
\end{itemize}
Keeping the derived class as small as possible is deliberate. A derivation rule
is a concession to human memory, not a security improvement, so it is applied
only where a generated secret cannot be retrieved.
\section{Account and Rule Register}
\index{passwords!register}
\begin{tabularx}{\linewidth}{L{2.4cm}L{2.9cm}L{1.9cm}Y}
\caption{Account, Server, and Password Rule Register\label{Table:PasswordRegister}}\\
\toprule \textbf{User} & \textbf{Server or service} & \textbf{Class} & \textbf{Rule and hint}\\ \midrule
\endfirsthead
\multicolumn{4}{l}{\small\itshape Account, Server, and Password Rule Register (continued)}\\
\toprule \textbf{User} & \textbf{Server or service} & \textbf{Class} & \textbf{Rule and hint}\\ \midrule
\endhead \bottomrule \endlastfoot
\texttt{root} & \texttt{ssw590-dev-01} & None & No password. Administrative access is obtained through \texttt{sudo} by a named account, so that privileged actions are attributable.\\
\texttt{payton} & \texttt{ssw590-dev-01}, \texttt{ssw590-build-01} & Derived & Used only to authenticate \texttt{sudo}; \gls{ssh} password authentication is disabled, so this secret never crosses the network.
\textit{Psst... sudo is a name, no?}\\
\texttt{ssw-app} & \texttt{ssw590-dev-01} & Generated & Unprivileged service account for course applications. Secret held in a file readable only by that account, excluded from the repository, and rotated per deployment.\\
Master & Password manager vault & Derived & A memorized password that isn't stored in its own vault.
\textit{Surely it's secure, no lie?}\\
Root user & AWS account & Generated & Reserved for account recovery and billing; \gls{mfa} enforced, not used for routine work.\\
\texttt{payton-admin} & AWS console, \gls{iam} & Generated & Day-to-day console account. \gls{mfa} enforced. Programmatic access uses short-lived credentials rather than a stored key pair.\\
\end{tabularx}
\section{Handling and Storage}
\index{passwords!handling}
\index{secrets}
The following rules apply to every entry above.
\begin{itemize}[leftmargin=*]
\item No password, private key, access token, or recovery code is recorded anywhere non-secure.
A secret is referred to by the location that holds it.
\item \gls{mfa} is enabled on every account that supports it.
\item A generated password is rotated by replacement. Any password is
rotated immediately if it is disclosed, and knowing one password
does not provide insight into other passwords.
\item Service credentials on a \gls{host} are supplied through a file or
environment variable owned by the service account, with access restricted
to that account, rather than being embedded in application source.
\end{itemize}