ハードコーディングの意味や回避方法を初心者にも分かりやすく解説

プログラミングを始めたばかりの人の中には、「ハードコーディングの意味を理解したい」、「ハードコーディングを減らすための技術を身につけたい」と思う人は多いのではないでしょうか?

ハードコーディングとは、設定値やデータをソースコードに直接埋め込む手法です。一見便利ですが、後々の管理やメンテナンスが難しくなることがあります。この記事では、ハードコーディングの基本的な意味、そして具体的な回避方法などを分かりやすく解説します。

無駄を削ぎ落とした情報共有ツール【Qiita Team】
シンプルな機能だから、記事が投稿されやすい!
【公式】https://teams.qiita.com にアクセスしてPDFを無料ダウンロード

ハードコーディングとは

ハードコーディングとは、本来分離して管理すべきデータや設定値を、ソースコード内に直接埋め込むことを指します。例えば、認証情報やAPIキー、データベース接続情報などをコードに直接書き込むケースです。こうした方法は一時的には便利ですが、コードの変更や管理が難しくなり、特に大規模なシステムでは管理が複雑化することがあります。

次に、なぜハードコーディングが避けるべき手法なのか、その理由を詳しく見ていきましょう。

ハードコーディングはなぜだめなのか

ハードコーディングにはいくつかの課題があります。まず、コードの柔軟性が失われる可能性があります。特定の値や設定をコードに直接書き込むと、環境や要件が変わったときに、その都度コードを修正しなければなりません。これにより、メンテナンスが煩雑になり、バグが発生しやすくなります。

次に、セキュリティ上のリスクが高まる恐れがあります。認証情報や機密データをコードに埋め込むことで、これらの情報が漏洩する危険性が増します。さらに、コードの再利用性が低下し、他のプロジェクトや環境で同じコードを使用することが難しくなります。これらの問題を避けるためには、設定ファイルや環境変数を利用し、コードと設定を分離することが推奨されます。

ハードコーディングの例

ハードコーディングの問題を理解するためには、具体的な例を挙げると分かりやすいです。ここでは、具体的な例を2つ挙げて説明します。

例1:認証情報のハードコーディング

認証情報をコードに直接書き込むと、コードが漏洩した場合にセキュリティの問題が発生しやすくなります。以下はその代表的な例です。

Python

database_username = “admin”database_password = “secure_password_123”

このようなコードは、一見してシンプルですが、もしソースコードが第三者に流出した場合、データベースに不正アクセスされる危険性があります。認証情報は設定ファイルや環境変数を利用して管理する方が安全です。

例2:固定URLのハードコーディング

APIのURLやリソースへのパスをコード内に直接埋め込むこともハードコーディングの一例です。

Java

String apiUrl = “https://api.example.com/data”;

このような実装では、APIのURLが変更された際に、そのコード部分を修正する必要があります。 しかし、同じURLが複数の箇所でハードコーディングされている場合、修正漏れが発生しやすくなります。これを避けるためには、設定ファイルや環境変数を使用することが推奨されます。

ハードコーディングされた認証情報のセキュリティリスク例

ハードコードされた認証情報は、セキュリティ上の問題を引き起こす可能性があります。

ここでは、実際の事例としてUberへのサイバー攻撃を紹介し、その危険性について詳しく解説します。

Uberへのサイバー攻撃

Uberへのサイバー攻撃は、ハードコードされた認証情報がどのように利用されるかを示す例です。2022年9月15日、当時18歳の攻撃者が、UberのIT環境に侵入した事件が発生しました。

この攻撃者は、ハードコードされた認証情報を利用して特権アクセス管理(PAM)システムにアクセスし、さらに高レベルのアクセス権を取得しました。この攻撃では、認証情報がPowerShellスクリプトにハードコードされていたため、攻撃者がそれを利用してシステム内で特権を昇格させたと考えられています。この事件は、ハードコードされた認証情報がどのようにセキュリティ侵害に利用されるかを示し、適切なセキュリティ対策の必要性を浮き彫りにしました。

Uberへのサイバー攻撃に関する分析の多くが、ソーシャルエンジニアリングと複数のMFAが標的になったことを重視していますが、初回の侵入後の攻撃で何が行われたのかがポイントと考えています。
設定ミスのネットワーク共有に組み込まれた認証情報が、この攻撃を解明する重要な手がかりです。
攻撃者は、PowerShellスクリプトに組み込まれたPAMソリューションの認証情報を入手後に高レベルのアクセス許可を獲得し、特権を昇格させてUberIT環境内を移動しています。
プロアクティブ(能動的)な保護は、多層防御のセキュリティ導入に基づきますが、今回の攻撃で特に明らかになったのは、侵害を想定することが最大の防御であるということです。」

– Shay NahariCyberArkRed Teamサービス、バイスプレジデント

(出典:Security update|Uber Technologies Inc.

ハードコーディングの問題点

ここではハードコーディングの問題点を2つに絞って解説します。

  • 再利用性の低下
  • メンテナンス性の低下

再利用性の低下

ハードコーディングは、コードの再利用性を低下させる恐れがあります。固定値に依存するコードは、異なるプロジェクトや環境で再利用する際に大幅な修正が必要となります。

このため、コードを他のプロジェクトで再利用する際の効率が悪くなり、新しい要件に対応しにくくなります。

メンテナンス性の低下

ハードコーディングは、コードのメンテナンス性を低下させる恐れもあります。固定値が散在しているコードは、バグ修正や機能追加の際にその値を全て確認・修正する必要があり、手間が増えます。

新しい開発者がプロジェクトに参加する場合、これらの固定値の意味や用途を理解するのに時間がかかることもあります。

ハードコードを回避し安全なソースコード管理をする方法

ハードコードを回避し、安全なソースコード管理を行うためには、いくつかの方法があります。ここでは、2つの回避方法をご紹介します。

  • 設定ファイルの使用
  • 秘密管理ツールの使用

設定ファイルの使用

ハードコーディングされた値は、設定ファイルや環境変数に移行することが推奨されます。例えば、YAMLやJSON形式の設定ファイルを使用して、設定情報を管理します。以下の手順を実践することで、コードの柔軟性とセキュリティを向上させることができます。

  • 設定ファイルの作成:必要な設定情報をYAMLやJSON形式のファイルに記載します。
  • コードのリファクタリング:プログラムが直接設定ファイルを読み込むようにコードを変更します。
  • 環境変数の設定:OSやCI/CD環境で環境変数を設定し、プログラムがこれらを参照するようにします。

また、セキュリティに関わる情報がバージョン管理ツールに保存された場合、git filter-repoやBFG repo cleanerを使用して履歴から削除する必要があります。これはコミットのSHAキーが変わる可能性があるため、注意が必要です。また、全てのリモートリポジトリやローカルデバイスも更新する必要があります。

秘密管理ツールの使用

機密情報は、秘密管理ツールで管理することが推奨されます。これにより、ハードコーディングを防ぐことができます。 

代表的な秘密管理ツールには以下のものがあります。

  • AWS Secrets Manager:AWS環境で機密情報を安全に管理するためのサービスです。
  • HashiCorp Vault:多様な環境で使用できる高機能な秘密管理ツールです。
  • Docker Secrets:Dockerコンテナ内で安全に機密情報を管理できます。

導入手順としては、まず機密情報をこれらのツールに登録し、その情報をプログラムから取得するコードを追加します。これにより、機密情報の漏洩を防ぎ、安全にソースコードを管理することができます。

まとめ

この記事では、ハードコーディングとは何か、その影響と対処法について説明しました。

ハードコーディングは、設定値やデータをコードに直接埋め込む方法です。一見シンプルですが、後々のコード変更やメンテナンスが難しくなり、情報漏洩などセキュリティの問題も発生します。これを防ぐには、設定ファイルや秘密管理ツールを使うと効果的です。コードの可読性が向上し、管理がしやすくなります。この記事を参考に、ハードコーディングの基礎を理解し、効果的な対策を学びましょう。