叡智の三猿

〜森羅万象を情報セキュリティで捉える

当サイトは、アフィリエイト広告を使用しています。

AIの仕事より、情報セキュリティの仕事!?

IT エンジニアを目指す学生と話すと、情報セキュリティに関係した仕事を希望している人がことのほか多いのにやや意外な感じを受けます。

いまは AI がトレンドです。だから学生が、「AIに関係した仕事をしたい」と言うのは、ものすごく腹に落ちます。

情報セキュリティの仕事は、AI の浸透にブレーキをかける可能性があります。

国家、自治体、企業によっては、対話型AIツールの「チャットGPT」へのアクセスを禁止しているところもあります。チャットGPTを使うことで膨大な個人情報が収集され、それが個人情報保護法に違反する可能性があるからです。

AI の志向が強い人にとって、情報セキュリティは避けたい仕事だと思うのです。

情報セキュリティの仕事というのは、明快なミッションを持っているようですが、実務では明確な解のない仕事でもあります。

たとえば、ソフトウエアの開発に於いて、セキュアプログラミングは情報漏えいを回避するうえで重要な取り組みです。

Java は多くのWebアプリケーションで使われる代表的な言語です。Javaの開発をしている現場のセキュリティエンジニアとしては、コーディングされた Java がセキュアかどうかを調べる必要があります。

日本における情報セキュリティ対策活動の向上に積極的に取り組んでいる「JPCERTコーディネーションセンター(JPCERT/CC)」では、「Java コーディングスタンダード CERT/Oracle 版」として、コーディングルールなど実践的な内容を網羅して発信しています。

下記のコードは、Webアプリケーションの脆弱性として有名な「SQL インジェクション攻撃」を許す危険なコードとして明示されています。入力 username をサニタイズ(特別な意味を持つ文字の特別さを無効化すること)せずにそのまま SQL クエリに使っているため、攻撃者は validuser' OR '1'='1 というような入力を与えることが可能だからです。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
class Login {
public Connection getConnection() throws SQLException {
DriverManager.registerDriver(new
com.microsoft.sqlserver.jdbc.SQLServerDriver());
String dbConnection =
PropertyManager.getProperty("db.connection");
// 次のような値を保持する
// "jdbc:microsoft:sqlserver://<HOST>:1433,<UID>,<PWD>"
return DriverManager.getConnection(dbConnection);
}
String hashPassword(char[] password) {
// パスワードのハッシュを作成する
}
public void doPrivilegedAction(String username, char[] password)
throws SQLException {
Connection connection = getConnection();
if (connection == null) {
// エラー処理
}
try {
String pwd = hashPassword(password);
String sqlString = "SELECT * FROM db_user WHERE username = '"
+ username +
"' AND password = '" + pwd + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sqlString);
if (!rs.next()) {
throw new SecurityException(
"User name or password incorrect"
);
}
// 認証されたので次の処理にすすむ
} finally {
try {
connection.close();
} catch (SQLException x) {
// ハンドラへ処理を渡す
}
}
}
}
引用:Java コーディングスタンダード CERT/Oracle 版_JPCERTコーディネーションセンター(JPCERT/CC)より

セキュリティエンジニアは、プログラマーではありません。しかし、コーディングがセキュアかそうでないかを判別するには、セキュリティエンジニアにもプログラムの知見が必要です。

プログラマーがセキュアコーディングの知識を持つべきか、あるいは、セキュリティエンジニアがプログラマーと別なチームでセキュリティ対策の検証をするのがいいのかは議論になります。

プログラマーと分けて、脆弱性診断を別なチームにすることで、セキュリティチェックの精度があがる期待はあります。ただ、それで会社全体の情報セキュリティに対する意識が高まるかは疑問です。

情報セキュリティは組織全体で共有すべき知見です。セキュリティ部門が専門化されると、会社の向くベクトルとそぐわないアンタッチャブルな存在になる可能性があります。

具体的には「情報セキュリティ原理主義者」と呼ばれる存在です。情報セキュリティに関する脆弱性や脅威をことさらに強調し、危険さをあおることで、ビジネスそのものを邪魔する人が、組織のところどころにいます。本来はビジネスを維持するための、情報セキュリティ対策ですが、本末転倒になってしまうのは会社にとっては悲劇です。