view Paper/chapter/chatsystem.tex @ 16:12648d2915e9

add slide fix paper
author kiyama <e185758@ie.u-ryukyu.ac.jp>
date Sun, 11 Feb 2024 17:27:00 +0900
parents 7619de63c978
children 8c6eb24536be
line wrap: on
line source

\chapter{メッセージングコマンドを使用した手法の提案}
演習科目では学生にシステム管理を体験させる活動を行ってきた.システム管理ではlinuxサーバーにアクセスしてコマンドを使用する.しかし,CLIでの操作に慣れていない学生が多く,稼働しているサーバー対して影響を与えるコマンドを実行することは学生にとって不安を感じさせるものだった.
これらの事からチャットツールであるMattermostを使用したシステム管理手法を提案する.


\section{システム概要}
システムの管理をオープンソースのセルフホスティング式のチャットサービスであるMattermostのスラッシュコマンドを通して実行する.
スラッシュコマンドにはMattermostが提供する組み込みスラッシュコマンドとユーザー自身が作成するカスタムスラッシュコマンドが存在する.
カスタムスラッシュコマンドではメッセージボックス上に /から始まる文字列を入力することで開発者が登録したエンドポイントに対しリクエストを送ることができる.
スラッシュコマンドには空のメッセージボックスに /を入力すると,すべてのスラッシュコマンドのリストが表示される.
カスタムスラッシュコマンドの後ろに空白くぎりで入力した文字列がリクエストボディとしてエンドポイントに送信される.


本手法では学科で管理しているシステムの状態を確認できる機能を提供するHTTPサーバーを立て,それにGET/POSTリクエストを送信することで処理を行う.図\ref{fig:chat-system}に構成図を示す.
学科システムは複数のサーバーから構成されている.それぞれでHTTPサーバーを立てるとサービス毎にリクエスト先を変更しないといけない為,統括して管理するHTTPサーバーを1つ立てる.
そのHTTPサーバーから他の基幹サーバー内で動作しているサービスに対し処理を送り結果をMattermostから確認できる.
HTTPサーバーはgolangのwebフレームワークのechoを使用してコンテナ上に構築した.

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=11.0cm]{fig/chatsystem4.png}
    \caption{システム構成図.}
    \label{fig:chat-system}
    \end{center}
\end{figure}

\newpage

実装したスラッシュコマンドは「/syskan」から始まり,空白区切りで特定の文字列を入力することで様々な処理が行われる.
Mattermostのスラッシュコマンドは通常のチャットと違い,実行するとユーザーの入力は表示されず結果のみチャンネルに出力される.
その為,図\ref{fig:syskan-command-exp}に示すように実行ユーザーと実行コマンドを先頭行に表示しその下に実行結果を出力するようにした.

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=12.0cm]{fig/syskan-exp-2.png}
    \caption{ユーザーとコマンドが表示される様子.}
    \label{fig:syskan-command-exp}
    \end{center}
\end{figure}

実装したコマンドの一覧は「/syskan help」と入力することで表示される.
コマンドの表示は異なるユーザーが確認として複数回実行すると想定した.その為,メッセージとしてチャンネルに投下するとコマンド一覧でログが埋まり,メッセージを圧迫する恐れがあった.
その為,「/syskan help」を含むコマンド自体の説明や一覧のコマンドは実行したユーザーのみに表示されるようにした.図\ref{fig:helpcommand}にその様子を示す.

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=15.0cm]{fig/helpcommand.png}
    \caption{/syskanコマンドの一覧.}
    \label{fig:helpcommand}
    \end{center}
\end{figure}


\section{認証機能の実装}
Mattermostはクラウドサーバー上で運用されているが今回実装したHTTPサーバーは基幹サーバー内で運用している.MattermostからHTTPサーバーにアクセスするためにグローバルIPを紐付け公開している.学科サーバーは在学中の生徒と教員のみがアクセス可能でありシステムの情報は秘匿するべきである.
その為外部からのアクセスを制限しMattermostからのみHTTPサーバーへのアクセスを許可した.

本研究で実装したスラッシュコマンドはMattermostのシステム管理チーム用の特定のチャンネルから実行可能である.そうする事で学生が実行したコマンドを他の学生が確認できるメリットの他に管理下にあるチャンネルからのみコマンドを受け付ける事で不審な入力をしていないかを管理者が把握しやすくなる.

Mattermostは学科に所属する全ての生徒がログインでき,システム管理チームのワークスペースも制限を授けていない為全生徒がスラッシュコマンドの実行が可能である.
しかし,学科のシステム利用者の情報はLDAPを用いて管理されており,サーバー上でシステム管理者として全ての操作を行えるのはsyskan,sudoのユーザー属性が割り振られているアカウントとなっている.
スラッシュコマンドでは一部rootユーザーが実行する処理があることやシステム管理の操作に慣れていない学生には操作ミスやセキュリティの観点から制限をつけるのが適切だと判断した.
その為,システム管理チームとそれ以外の利用者でスラッシュコマンド経由で実行できる操作に制限をかけた.
Mattermostはログインの際にGitLab認証を使用しており,GitLabはLDAP情報からログインを行う.
その為Mattermostのアカウント名などはLDAPに登録されている情報から作成される.
また,Mattermostはスラッシュコマンドを実行する際にコマンド以外に実行したチャンネル情報や実行した操作者の情報をデータをして送信する.データの中にユーザー名がありHTTPサーバーでユーザー名でLDAP認証を行いsudo,syskanのユーザー属性を持つかを確認することによって実行できる操作に制限をかけることができる.

\section{仮想環境の確認}
仮想環境を確認するコマンドは「podman」と「vm」が基準のコマンドである.それぞれで実行できるコマンドを図\ref{fig:podmancommand},\ref{fig:vmcommand}に示す.
Podman環境では主に基幹サービスが稼働している.その為,コンテナの状態やコンテナ上のサービスのログを確認するコマンドを実装した.「ps サーバー名」で図\ref{fig:podman-ps}に示すように,選択したサーバー上で動作しているコンテナの一覧が確認できる.「logs コンテナ名 サーバー名」で図\ref{fig:podman-logs}に示すように選択したサーバー上のコンテナログが表示される .「inspect コンテナ名 サーバー名」で図\ref{fig:podman-inspect}に示すように選択したサーバー上のコンテナの使用イメージ,状態,ネットワーク設定,環境変数などの情報がjson形式で確認できる.


\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=13.0cm]{fig/slash-podman.png}
    \caption{/syskan podmanコマンドの一覧.}
    \label{fig:podmancommand}
    \end{center}
\end{figure}

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=15.0cm]{fig/podman-ps.png}
    \caption{/syskan podman psの実行結果.}
    \label{fig:podman-ps}
    \end{center}
\end{figure}

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=15.0cm]{fig/podman-logs.png}
    \caption{/syskan podman logsの実行結果.}
    \label{fig:podman-logs}
    \end{center}
\end{figure}

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=15.0cm]{fig/podman-inspect.png}
    \caption{/syskan podman inspectの実行結果.}
    \label{fig:podman-inspect}
    \end{center}
\end{figure}

vm環境は学生の実験演習や学内外のイベント時の開発環境として使用されている.その為スラッシュコマンドでは作成されたvmの一覧と外部公開時の監査用のコマンドを実装した.
「audit 作成したVM名 審査用アカウント名 vmIPアドレス」は下記の「key-gen」オプションで生成された公開鍵を登録したVMに対して自動監査を実行できる.図\ref{fig:vm-audit}に示すように監査項目にはアクセス制限,ssh portの変更,rootアクセス,セキュリティアップデートの項目があり,それらの設定ファイルが出力される.管理者は出力されたファイルから適切に設定されているかを確認する事で監査をおこなう.
「key-gen 審査対象のVM名 vmのIPアドレス」では図\ref{fig:vm-keygen}に示すように自動監査で使用する公開鍵が生成されチャット上に表示される.自動審査の際,admin権限のみしか悪できないファイルを確認する必要がある為監査用のアカウントにてパスワードなしでコマンドを実行できるよう設定する必要がある.
「list サーバー名」では図\ref{fig:vm-list}に示すように選択したサーバー上で稼働しているVMが表示される.

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=15.0cm]{fig/slash-vm.png}
    \caption{/syskan vmコマンドの一覧.}
    \label{fig:vmcommand}
    \end{center}
\end{figure}

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=15.0cm]{fig/vm-audit.png}
    \caption{/syskan vm auditコマンドの結果.}
    \label{fig:vm-audit}
    \end{center}
\end{figure}

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=15.0cm]{fig/vm-keygen.png}
    \caption{/syskan vm keygenコマンドの結果.}
    \label{fig:vm-keygen}
    \end{center}
\end{figure}

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=15.0cm]{fig/vm-list.png}
    \caption{/syskan vm listコマンドの結果.}
    \label{fig:vm-list}
    \end{center}
\end{figure}


% \section{ファイルシステムの調査}
% サーバーの容量確認では df を基準のコマンドする. よく確認するルート直下の容量はディレクトリの指定無しで表示できるようにする.

% ceph の状態確認では ceph を基準のコマンドとする. クライアントのステータス表示によって異常がある場合はエラーメッセージの確認が可能である.

\section{バックアップの確認}
図\ref{fig:backupcommand}のようにバックアップディレクトリを表示するコマンドは「backup」を標準のコマンドとする.バックアップの確認では取られているディレクトリの中でも頻繁に書き込みが行われているpodmanコンテナを管理するディレクトリ,KVMのテンプレートイメージファイルが置かれているディレクトリを表示するよう設定した.図\ref{fig:backupkvm-tpl},図\ref{fig:backup-podman}

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=15.0cm]{fig/backup-help.png}
    \caption{/syskan backupコマンドの一覧.}
    \label{fig:backupcommand}
    \end{center}
\end{figure}

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=15.0cm]{fig/backup-kvm.png}
    \caption{/syskan backup kvm-tplコマンドの実行結果.}
    \label{fig:backupkvm-tpl}
    \end{center}
\end{figure}

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=15.0cm]{fig/backup-podman.png}
    \caption{/syskan backup podmanコマンドの実行結果.}
    \label{fig:backup-podman}
    \end{center}
\end{figure}

\section{LDAPの操作}
図\ref{fig:ldap-help}のように学科の学生アカウントを管理しているLDAP系統の操作は「ldap」が基準のコマンドとなっている.「search 学籍番号」で図\ref{fig:ldap-search}に示すように管理されている学生の情報を確認できる.
また演習科目では基幹サーバーを操作する際に学生にサーバーの管理者権限を付与していた.しかし授業毎に権限を与えていず継続的に権限を付与していた.教員やシス管メンバーが見ている授業内であれば操作ミスに指摘できるが,個人でサーバーにアクセスし操作する可能性があった.その為一定時間権限を付与できるコマンドを実装した.「add sudoers ユーザー名 時間(分)」で指定したユーザーに指定した時間サーバーの管理者権限を付与できる.
「delete sudoers ユーザー名」で追加されたユーザーの削除が可能となっている.これらの追加・削除の処理は一般ユーザーが実行できないように認証がかかっている.

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=15.0cm]{fig/ldaphelp.png}
    \caption{/syskan ldapコマンドの一覧.}
    \label{fig:ldap-help}
    \end{center}
\end{figure}

\begin{figure}[htpb]
    \begin{center}
        \includegraphics[clip,width=15.0cm]{fig/ldap-search.png}
    \caption{/syskan ldap searchコマンドの実行結果.}
    \label{fig:ldap-search}
    \end{center}
\end{figure}

% \begin{quote}
%     \begin{itemize}
%         /syskan ceph health \\
%         /syskan ceph status \\ 
%         /syskan ceph help \\
%         /syskan df \{aman, braun, christina, daru\} \\
%         /syskan df help \\
%         /syskan backup podman \\
%         /syskan backup kvm-tpl \\
%         /syskan backup help \\
%         /syskan vm audit \$vm\_name \$vm\_user \$vm\_ip \\
%         /syskan vm key-gen \$vm\_name \$vm\_ip \\
%         /syskan vm list \{aman, braun, christina, daru\} \\
%         /syskan vm help \\
%         /syskan podman ps \{aman, braun, christina, daru\} \\
%         /syskan podman logs \$podman\_name \{aman, braun, christina, daru\} \\
%         /syskan podman inspect \$podman\_name \{aman, braun, christina, daru\} \\
%         /syskan podman help \\
%         /syskan ldap search \$username \\
%         /syskan ldap add sudoers \$username \$minutes \\
%         /syskan ldap delete sudoers \$username \\
%         /syskan ldap help \\
%     \end{itemize}
% \end{quote}

\section{実装結果}
システムの状態を確認するコマンドや演習授業で一時的に権限を付与する為のコマンドを実装した.
授業の中でコマンド操作の指示を出している途中に実行してしまう事例やコマンドのタイプミスが何度か見受けられた.この場合,システムに予期しない変更を与える可能性が考えられる.
今回提案したスラッシュコマンドはシステムの状態を確認する処理がほとんどである事やコマンドを途中で実行してしまっても決められた引数を使用しないと実行されないこと,権限の追加・削除といった処理は認証が必要な事から安心してコマンドを実行できると考えられる.
またスラッシュコマンドで実装したシステム管理ではやり取りが個人で閉じずチャンネル参加者全員に表示される.その為誰が何を実行したかが一目瞭然であり,実験演習のような多人数が参加するシステム管理活動に有効と言える.