IPアドレスが複数存在すること、OSユーザー、プログラムユーザー、データベースユーザー(DBユーザー)を管理し、さらにパスワードを特定のグループに所属するユーザーにのみ見せるためのデータベース設計を提案します。
機器テーブル (equipment) これは基本的な機器情報を管理するテーブルです。これは変更ありません。
sql コードをコピーする CREATE TABLE equipment ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, model VARCHAR(100), serial_number VARCHAR(100) UNIQUE, purchase_date DATE, status VARCHAR(50), location VARCHAR(100) );
ネットワーク情報テーブル (network_info) 複数のIPアドレスとMACアドレスを管理するテーブルです。
sql CREATE TABLE network_info ( id SERIAL PRIMARY KEY, equipment_id INT REFERENCES equipment(id) ON DELETE CASCADE, ip_address INET, mac_address VARCHAR(17), interface_name VARCHAR(50) );
OS情報テーブル (os_info) 機器のOS情報を管理するテーブルです。
sql CREATE TABLE os_info ( id SERIAL PRIMARY KEY, equipment_id INT REFERENCES equipment(id) ON DELETE CASCADE, os_name VARCHAR(100) NOT NULL, os_version VARCHAR(50), install_date DATE );
ユーザグループテーブル (user_groups) ユーザグループを管理します。特定のグループに所属するユーザーのみがパスワードにアクセスできるように、グループごとに権限を分けます。
sql CREATE TABLE user_groups ( id SERIAL PRIMARY KEY, group_name VARCHAR(50) NOT NULL UNIQUE, can_view_passwords BOOLEAN DEFAULT FALSE );ユーザーテーブル (users) 各種ユーザー(OSユーザー、プログラムユーザー、DBユーザーなど)を管理するテーブルです。ユーザーは複数のグループに属することができ、パスワードの閲覧権限もここで決まります。
sql CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(100) NOT NULL, user_type VARCHAR(50) NOT NULL, -- 'OS', 'Program', 'DB'など group_id INT REFERENCES user_groups(id) ON DELETE CASCADE );
パスワード管理テーブル (passwords) パスワードを管理するテーブルです。ユーザーグループごとの権限に応じて、このテーブルの内容を参照できるようにします。パスワードはセキュリティのために暗号化して保存します。
sql CREATE TABLE passwords ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id) ON DELETE CASCADE, password TEXT NOT NULL -- 暗号化されたパスワードを保存する );重要: passwordフィールドに保存するパスワードは必ず暗号化(例: pgcrypto拡張を使用してハッシュ化)する必要があります。
sql -- pgcrypto拡張のインストール(必要に応じて) CREATE EXTENSION pgcrypto; -- パスワードをハッシュ化して挿入 INSERT INTO passwords (user_id, password) VALUES (1, crypt('user_password', gen_salt('bf')));
プログラム情報テーブル (installed_programs) インストールされているプログラムと、そのユーザーを管理するテーブルです。
sql CREATE TABLE installed_programs ( id SERIAL PRIMARY KEY, equipment_id INT REFERENCES equipment(id) ON DELETE CASCADE, program_name VARCHAR(100) NOT NULL, version VARCHAR(50), install_date DATE );
プログラムユーザーテーブル (program_users) プログラムごとのユーザーと、そのアクセスレベルを管理します。
sql CREATE TABLE program_users ( id SERIAL PRIMARY KEY, program_id INT REFERENCES installed_programs(id) ON DELETE CASCADE, user_id INT REFERENCES users(id) ON DELETE CASCADE, access_level VARCHAR(50) -- 例: 'Administrator', 'User'など );
ユーザグループの挿入
sql INSERT INTO user_groups (group_name, can_view_passwords) VALUES ('Admin', TRUE), ('User', FALSE);
ユーザーの挿入(OS、プログラム、DBユーザー)
sql INSERT INTO users (username, user_type, group_id) VALUES ('os_admin', 'OS', 1), ('db_user', 'DB', 2), ('program_user', 'Program', 2);
パスワードの挿入(ハッシュ化)
sql INSERT INTO passwords (user_id, password) VALUES (1, crypt('os_admin_password', gen_salt('bf'))), (2, crypt('db_user_password', gen_salt('bf'))), (3, crypt('program_user_password', gen_salt('bf')));
プログラムの挿入
sql INSERT INTO installed_programs (equipment_id, program_name, version, install_date) VALUES (1, 'Microsoft Office', '2019', '2023-02-12'), (2, 'LibreOffice', '7.1', '2022-11-16');
プログラムユーザーの挿入
sql INSERT INTO program_users (program_id, user_id, access_level) VALUES (1, 1, 'Administrator'), (2, 3, 'User');
パスワードを閲覧できるのは、特定のグループ(例えばAdminグループ)に所属しているユーザーに限定します。例えば、can_view_passwordsがTRUEのグループに属するユーザーのみがパスワードを取得できるようにします。
パスワードの表示(管理者グループのみ)
sql SELECT u.username, p.password FROM users u JOIN passwords p ON u.id = p.user_id JOIN user_groups g ON u.group_id = g.id WHERE g.can_view_passwords = TRUE;
特定ユーザーのパスワードを表示(グループに基づく)
sql SELECT u.username, p.password FROM users u JOIN passwords p ON u.id = p.user_id JOIN user_groups g ON u.group_id = g.id WHERE u.username = 'os_admin' AND g.can_view_passwords = TRUE;