この章では,トラステッド Tru64 UNIX システム上でのトラステッド・アプリケーションの実行に関連する事項について説明しています。ライブラリ,ヘッダ・ファイル,標準のトラステッド・システム・ディレクトリ,およびトラステッド・コンピューティング・ベース (TCB) について記述しています。この章およびこの章以降では,C プログラムの一部や全体を使用して,基本的な考え方を説明します。変更せずに使用できるプログラムも記載されていますが,これらのルーチンを集めても,トラステッド・プログラムを構築することはできません。
本書で説明するプログラミング技法のほかに,次の技法も使用できます。
Common Data Security Architecture (CDSA)
CDSA はマルチプラットフォーム,業界標準のセキュリティ構造です。標準規格に基づく,安定したプログラミング・インタフェースを提供します。アプリケーションはこのインタフェースを使用して,オペレーティング・システムのセキュリティ・サービスにアクセスできます。これによって開発者は,クロスプラットフォームの,セキュリティに対応したアプリケーションを作成できます。アプリケーションは,動的拡張性のあるアプリケーション・プログラミング・インタフェース (API) を通じて,暗号化や他の公開鍵処理などのセキュリティ・サービスをリクエストします。このリクエストは,一連のプラグイン・セキュリティ・サービス・モジュール (SPI) によって遂行されます。SPI は,ビジネス要件と技術の発展に従って補ったり,変更したりできます。
CDSA
についての詳細は,
cdsa
(3)
Secure Socket Layer (SSL)
SSL は,インターネット上でのメッセージの送受信のセキュリティを管理するための一般的なプロトコルです。最近は,SSL をベースにした Transport Layer Security (TLS) が SSL に取って代わっています。SSL は Hypertext Transfer Protocol (HTTP) レイヤと Transport Control Protocol (TCP) レイヤの間にあるプログラム・レイヤを使用します。提供されている OpenSSL ライブラリは,Secure Sockets Layer (SSL v2/v3) および Transport Layer Security (TLS v1) プロトコルを実装しています。
SSL
についての詳細は,
ssl
(3)
この章では,次の内容について説明しています。
この章およびこの章以降では,C プログラムの一部や全体を使用して,基本的な考え方を説明します。変更せずに使用できるプログラムも記載されていますが,これらのルーチンを集めても,トラステッド・プログラムを構築することはできません。
1.1 セキュリティ・プログラミングの概要
トラステッド・コンピューティング・ベース (TCB) を誤って変更しないように,保護しなければなりません。そのためには,どのプログラムとデータ・ファイルが TCB の一部なのかをまず定義します。以下に,TCB の構成要素について説明します。
トラステッド・プログラム: セキュリティ・ルールを破壊できる立場にあるプログラムは,トラステッド・プログラムでなければなりません。このようなプログラムには,直接セキュリティ上の決定を行うプログラムと,決定は行わないがプログラムに誤りまたは不正なコードがある場合にセキュリティ・ルールを破壊する可能性があるプログラムがあります。ユーザ ID に root (SUID) が設定されているプログラム・ファイルの場合は,トラステッド・プログラムであると考えられます。
間接プログラム: 他のトラステッド・プログラムから起動されたり,他のトラステッド・プログラムと連携して動作することによって,セキュリティ上の決定に利用されるプログラムは,トラステッド・プログラムです。他のトラステッド・プログラムが依存しているデータ・ファイルやその他のオブジェクトを変更するプログラムも,トラステッド・プログラムです。
オブジェクト・コードとライブラリ: 静的リンクか動的リンクかにかかわらず,トラステッド・プログラムに組み込まれるオブジェクト (バイナリ) コード・モジュールとそれらのファイルはすべて,TCB の一部です。これには,トラステッド・プログラムで頻繁に使われる標準 C ライブラリ・ルーチンとインタフェースがあります。
データ・ファイル:
TCB には,セキュリティ上の決定を行うためにトラステッド・プログラムで使用するデータが格納されたファイル (たとえば,ttys
データベース) が含まれます。
シェル・スクリプト:
シェル・スクリプトはデータ・ファイルで,シェル・プログラムがこのファイル内のシェル・コマンドを解釈し,実行します。シェル・スクリプトが,トラステッド・プログラムに代わって機能を実行するか,トラステッド・システムの正常な動作に欠かせない場合,そのシェル・スクリプトは TCB の一部とみなされます。スクリプトの削除や移動により,システムが誤って動作する (たとえば,一部の
rc
スタートアップ・スクリプトを削除する) か,セキュリティが侵害される可能性がある (異なる
cron
スタートアップ・ファイルをインストールする) 場合は,そのシェル・スクリプトがセキュリティに関連すると判断することができます。シェル・スクリプト・ファイルは,オブジェクト・コード・プログラム・ファイルと同じように,慎重に保護する必要があります。シェル・スクリプトを実行するには,そのスクリプトが読み取り可能でなければなりません。
親ディレクトリ: TCB ファイルの親ディレクトリはすべて TCB の一部とみなし,同様に保護する必要があります。悪意を持ったユーザがこれらのディレクトリでリンクを削除したり再定義することができると,このユーザが新しくにせのファイルを作成することができます。これにより,トラステッド・プログラムが,誤ったセキュリティ上の決定を行う可能性があります。
以下の各メカニズムは,TCB のファイルとディレクトリを保護する方法を提供しています。
Discretionary Access Control (DAC): 任意アクセス制御 (所有者,グループ,モード・ビット,およびアクセス制御リスト (ACL)) は,TCB ファイルに対する,最も重要な保護です。信頼できないユーザとグループに対しては,ファイルの読み取りを許可しても,ファイルの変更を行えないようにしなければなりません。このためには,疑似ユーザと疑似グループを作成するのが一般的です。
既存のプログラムは,ファイルを複製するときにモード・ビットだけをコピーし,誤って ACL を削除してしまうことがあります。これにより,ACL による保護が行われなくなります。other::---
および
group::---
のような制限された従来の許可コードを使用してから,ユーザ・エントリによって個々のユーザへアクセス権を与えてください。この方法を使うと,ACL が失われても,意図していないアクセスは許可されません。ACL を使用したプログラミングについては,第 7 章を参照してください。
読み取り専用ファイル・システム: 読み取りだけが必要なファイルを,すべて別のファイル・システムに置き,そのファイル・システムを読み取り専用としてマウントできます。これにより,どのプログラムも特権に関係なく,これらのファイルを変更することができなくなります (ファイル・システムを再マウントした場合を除く)。ファイルを変更する必要がある場合には,ファイル・システムを読み書き両用として再マウントすることができます。この方法は,少し極端かもしれませんが,セキュリティ・データを破損から保護する良い方法です。また,リムーバブル・メディアの読み取り専用ロック・タブを物理的に設定することもできます。
スティッキ・ビット: Tru64 UNIX では,ディレクトリ・エントリにスティッキ・ビットがあります。スティッキ・ビットが設定されていると,ディレクトリ・エントリ (リンク) の削除は,要求しているユーザがそのディレクトリを所有している場合 (つまり,ディレクトリの所有者) だけに制限されます。この保護がない場合,ディレクトリへの書き込みアクセス権さえあれば,プログラムはディレクトリ・エントリを削除できます。スティッキ・ビットは,適切に使用してください。たとえば,1 つのディレクトリに,異なるユーザが所有するファイルを格納する必要があるプログラムの場合に使用します。
Tru64 UNIX では,セキュリティ統合アーキテクチャ (SIA: Security Integration Architecture) を提供しています。このアーキテクチャは,ローカル・セキュリティ認証メカニズムおよび分散セキュリティ認証メカニズムを,オペレーティング・システム上に階層化可能にします。SIA 構成フレームワークは,セキュリティを扱うコマンドを,特定のセキュリティ・メカニズムから切り離します。詳細については,『セキュリティ・ガイド』の「SIA インタフェースの使用
」の章と,
sia*
(3)
また,『セキュリティ・ガイド』の「プログラマ向けセキュリティ・ガイド」でも,トラステッド・プログラムの作成に関する詳細を説明しています。
1.2 ライブラリとヘッダ・ファイル
システムのドキュメントには,すべての新しいセキュリティ・システム・コール (セクション 2) とルーチン (セクション 3) のリファレンス・ページが含まれています。
ライブラリ
libsecurity.so
,libaud.a
,libaud.so
,libpacl.a
,および
libpacl.so
には,新しく拡張されたセキュリティ・インタフェースのバイナリがあります。これらのライブラリをプログラムにリンクするには,-l
コンパイル・オプションを使います。たとえば,次のように使用します。
$ cc ... -lsecurity -ldb -lm -laud ...
プログラムには,いくつかのヘッダ・ファイルを取り込む (インクルードする) 必要があります。このヘッダ・ファイルには,Tru64 UNIX セキュリティ・インタフェースを使うのに必要な定義 (定数,マクロ,構造体,ライブラリ・インタフェースなど) があります。従来の UNIX の慣例に従い,すべての Tru64 UNIX システム・コールとライブラリのリファレンス・ページでは,そのルーチンを使うために必要なヘッダ・ファイルを示しています。多くの場合,次の各ヘッダ・ファイルを,次の順序で使用します。
<sys/secdefines.h>
システムのセキュリティ構成を決定するコンパイル定数を定義します。 このファイルは,必ず最初にインクルードする必要があります。
<sys/security.h>
一般的な定義を格納しています。このファイルは,ほとんどの場合にインクルードする必要があります。
<sys/acl.h>
アクセス制御リスト用です。このファイルは,アクセス制御リストを操作する場合に必要です。
<prot.h>
認証データベースと Tru64 UNIX 保護サブシステムを定義しています。プログラムで認証データベースをアクセスする場合に必要です。
<sys/audit.h>
セキュリティ監査インタフェースの監査サブシステム定数を定義しています。監査レコードを生成または処理する場合に必要です。
<protcmd.h>
Tru64 UNIX で提供されるトラステッド・コマンド用のその他の定義がいくつかあります。多くの場合,これらの定義は必要ありません。
<sia.h>
SIA の定数,構造体,およびマクロ定義があります。
<siad.h>
インタフェースおよびセキュリティ・メカニズムで内部的に使用する,SIA の定数,構造体,およびマクロ定義があります。
Tru64 UNIX では,セキュリティ情報を格納するためにいくつかのディレクトリが定義されています。これらのファイルとディレクトリの説明は,リファレンス・ページで参照できます (特にリファレンス・ページのセクション 4)。
標準のトラステッド・システム・ディレクトリ内に,新たにファイルおよびディレクトリを作成することが必要な場合もあります。通常,これらのツリーにファイルを置くときは,新しいディレクトリを作成する必要があります。このようなファイル用として作成されているディレクトリの場合以外は,既存のディレクトリに新しいファイルを置かないでください。表 1-1
は,使用する可能性のあるディレクトリを示しています。
表 1-1: 標準のトラステッド・システム・ディレクトリ
ディレクトリ | 内容 |
/tcb/bin,/usr/tcb/bin |
直接実行されるトラステッド・コマンドおよびデーモンが置かれます。 |
/tcb/lib |
コマンド行からは起動されず,他のトラステッド・プログラムから実行されるプログラムが置かれます。 |
/tcb/files |
トラステッド・コンピューティング・ベース (TCB) で使用する制御ファイル,データベース,およびスクリプトが置かれます。必要に応じて,保護サブシステム用にこのディレクトリのサブディレクトリを定義することができます。 |
/var/tcb |
/tcb
ディレクトリの代替ディレクトリです。 |
1.4 セキュリティに関連するシステム・コールとライブラリ・ルーチン
以降の項の表では,プログラマから見てセキュリティに関連する Tru64 UNIX システム・コールとライブラリ・ルーチンを示しています。
ただし,これらの項で扱っていないシステム・コールとライブラリ・ルーチンについても,セキュリティに関連するものがあります。
システム・コールやライブラリ・ルーチンを誤って使用し,セキュリティに対する配慮が行われなければ,コンピュータ・システムのセキュリティが脅やかされる可能性があります。たとえば,特権プロセスからシステム・コールが呼び出された場合,ファイル・アクセス許可はチェックされません。最終的には,プログラマがプログラムのセキュリティに関して責任を持つことになります。
1.4.1 システム・コール
表 1-2は,プログラマから見てセキュリティに関連するシステム・コールを示しています。
表 1-2: セキュリティに関連するシステム・コール
カテゴリ | システム・コール |
ファイル制御 | creat ,open ,fcntl ,read ,mknod
[脚注 1]
,write |
プロセス制御 | fork ,
sigpause ,execve ,sigsetmask ,setpgrp
[脚注 1],
sigvec ,sigblock |
ファイル属性 | access ,chroot
[脚注 1],
,chmod
[脚注 1],
stat ,chown
[脚注 1],
,umask |
ユーザ ID とグループ ID | getegid ,getuid ,getgid ,
setgroups
[脚注 1],
geteuid ,setreuid
[脚注 1] |
監査 | audcntl
[脚注 1],
audgen
[脚注 1] |
汎用 | syscall |
ライブラリ・ルーチンは,プログラムから呼び出せるシステム・サービスです。多くのライブラリ・ルーチンでは,システム・コールを使用します。表 1-3は,セキュリティに関係する Tru64 UNIX ライブラリ・ルーチンを示しています。
表 1-3: セキュリティに関連するライブラリ・ルーチン
カテゴリ | ライブラリ・ルーチン |
ファイル制御 | fopen,popen |
パスワード処理 | getpass,putpwent,getpwnam,setpwent,getpwent,endpwent,getpwuid,passlen,pw_mapping,randomword,time_lock |
プロセス制御 | signal |