不動の鳥の勉強記録

時間があるときに勉強したことをメモします。

SQL ServerのDBアカウントの権限管理を考える

■はじめに

SQL Severのアカウントを作成するときに、適切なアカウント管理をしたいと改めて権限管理について考えてみました。システム監査が行われるような企業では、必ずアカウント管理は問われる部分ですのでしっかりしていきたいものです。

本記事の想定環境

・MW: SQL Server 2017

■現状と課題

SQL Serverのアカウントは大きく、インスタンス範囲で権限を与える「サーバレベルのロール」と、データベース事に権限を管理する「データベースレベルのロール」の2種類があります。大きくサーバレベルのロールで一定の権限を制御し、データベースレベルのロールで複数あるデータベースについて細かく権限を制御する思想と読み取れます。

ただし、データベースレベルのロールは細かく権限が管理されていることから、1インスタンス上に複数のデータベースが作成されるような設計のサーバを運用する場合、規模にもよりますが下記2つの負担がどのシステム運用担当へかかるのかと思います。

  • アカウント管理にかかわるサービス要求数が多いこと
  • ユーザごとに細かい権限のリクエストがあり、一つずつ設定するのは手間がかかること

これらの負担に対しデフォルトの権限で管理している場合は、大体のユーザに必要以上のsys_admin権限や、db_owner権限を付与してしまいがちです。(やっちゃいけませんが)
強い権限があるとユーザはなんでもできてしまうので、オペレーションミスや悪意を持ったユーザにアカウントを乗っ取られたときのリスクは大きいです。そのため、最小権限でかつ簡易に管理できる解決策はないものかと考えていました。

■解決策

安直に考えた解決案は下記2つです。

1. アカウント管理システムを導入する

きめ細かいアカウント管理を行えるシステムを導入する。
アカウント管理システムを導入することで、申請書に基づいて自動でアカウント管理をしてくれることと、細かい権限が選択できることで上記2つの課題を解決することができると考えました。
ただし内製の場合、SQL Serverのエディション事に権限と機能が異なることと、これからの新バージョンが出来上がるたびにメンテナンスを行わないといけません。そのため、規模に応じて外部ソフトウェアを購入を検討してもいいかもしれません。
また、大きな会社だと会社としての内製のアカウント管理システムがあり、それが希望するDB製品に対応しておらず対応予定もないという悲しい結末に当たるかもしれません…

2. アカウントのロールを作成する

SQL Serverは「サーバレベルのロール」および「データベースレベルのロール」を作成することができます。
どのようなロールがあり、どのような権限があるとどのようなコマンドなどが実行できるかは、下記ポスターに一覧化されているので見ていただけるとわかりやすいかと思います。

aka.ms ※ダウンロードしておくのおすすめです。

どちらを作成するべきか?は組織の規模と、データベースの管理思想によって異なるためどちらがいいかは一概に言えません。個人的な意見としては、複数のインスタンスをまとめて管理しているときに、各インスタンス内のデータベース事に「データベースレベルのロール」を作成するのは面倒と感じてしまいます。そのため、アカウント発行先のチームごとに、「サーバレベルのロール」で大枠の権限を付与し、それでも制御できないかゆいところを「データベースレベルのロール」で補完する設計が管理上も楽になるのではないかと考えています。

■結論

会社の規模等により状況は異なりますが、個人的にはシステムで管理するのが一番楽と考えています。しかし、予算などの理由から難しい場合はロールで管理するで十分と考えています。ただし、ロールを作成して運用していたのち、システムを導入するとなった場合、独自のロールをインポートできるかどうか、インポートできない場合はどうするかは要件定義の時にしっかりと検討していただきたい点です。

■終わりに

アカウント管理はシステム運用開始してから、システム運用終了までずっと付きまとう業務です。この業務をどこまで楽にできるようにしておくかで、システム運用後のランニングコストに響いてきますので、導入時に検討していただく価値はあると思っています。

SQL Serverは「アプリケーションロール」というロールもあるようです。ただ、今までずっとSQL Serverの面倒を見てきましたが、「アプリケーションロール」を設定したいというサービス要求などは全くありませんでした。この機能をうまく使うベストプラクティスは謎です。ただ、このロールを使わなくても「サーバレベルのロール」および「データベースレベルのロール」で十分なため深く考えないようにします。詳しい方でこんな時に使うと便利だよなど知見があれば教えていただきたいです。

■参考

毎度ながらマイクロソフト様のドキュメントを参考にしています。