データサイエンティストがセキュリティを学ぶポジティブな理由

## はじめに

◆この記事は何？
セキュリティを学んで良かったこと、セキュリティを学ぶ理由について紹介する記事です。

◆この記事のねらい
セキュリティを勉強する際のモチベーション向上につながれば幸いです。

## 先に結論

データサイエンティストの私がセキュリティを学ぶ理由
- 市場価値を高めるため
- 実装力を高めるため
- 学習効率を上げるため

セキュリティを学んで良かったこと
- コンピュータサイエンスの基礎が広く学べる
- いろんなエンジニアと、なんとなく会話できるようになった
- セキュリティに対して主体的になった

## 背景
2024年春に、情報処理技術者試験の情報処理安全確保支援士試験（旧セキュリティスペシャリスト試験）を受験しました。

お恥ずかしながら、これまで時間をかけてセキュリティを学んではいませんでした。

応用情報やAWS認定資格などの資格取得のため必要になったら学ぶ、業務で必要になったら調べる、程度の勉強でした。

情報処理安全確保支援士の勉強によって、強度高くセキュリティを学ぶことができました。

セキュリティを学んでいくうちに、学ぶ理由や学んで良かったことが言語化できるようになってきました。

この記事では、データサイエンティストの私がセキュリティを学んだ経験をお伝えできればと思います。

## 市場価値を高める

何か根拠があるわけではなく、私の意見に過ぎないのですが、

「ただのデータサイエンティスト」よりも「実装できるデータサイエンティスト」の方が市場価値は高く、さらに「**セキュリティを意識して実装できるデータサイエンティスト**」の方が市場価値は高い

と感じるようになりました。

データサイエンススキルが同等であれば、最初からセキュリティを意識してくれるデータサイエンティストに仕事を依頼すると思います。

セキュリティの知識が自分の強みの一つになりました。

大袈裟に言えば、「データサイエンティストとしての市場価値が上がった」という自信になりました。

## セキュリティを意識したコーディング

セキュリティを意識したコーディング、いわゆる「セキュアプログラミング」が少しは分かるようになりました。

お恥ずかしながら、Jupyter Notebookでの分析の段階ではあまり意識できていませんでした。

例えば、ディレクトリトラバーサルです。

画像認識モデルで推論するとき、画像ファイルを読みこむために、ファイルパスを取得する処理があります。

次のような例を考えます。

```python
import os

def get_file_path(dir_name, user_input_filename):
    '''
    ディレクトリパスとファイル名からファイルパスを取得する関数
    '''
    file_path = os.path.join(dir_name, user_input_filename)
    return file_path

# 安全であるべきディレクトリパス
base_dir = "/var/www/data"

# 悪意のあるユーザー入力(悪意のある画像ファイル名)
malicious_input = "../etc/passwd"

file_path = get_file_path(base_dir, malicious_input)
```

これだとディレクトリトラバーサルの対象となりえます。
意図しないディレクトリへのアクセスが可能となります。

サニタイジングや相対パスの除去を加えることで、より安全になります。


```python
import os

def get_file_path(dir_name, user_input_filename):
    '''
    ディレクトリパスとファイル名からファイルパスを取得する関数
    '''
    _base_name = os.path.basename(user_input_filename)
    file_path = os.path.abspath(os.path.join(dir_name, _base_name))
    
    # 安全なベースディレクトリの中にあることを確認する
    if not file_path.startswith(os.path.abspath(dir_name)):
        raise ValueError("Unauthorized access attempt to a restricted area")
        
    return file_path

# 安全であるべきディレクトリパス
base_dir = "/var/www/data"

# 悪意のあるユーザー入力(悪意のある画像ファイル名)
malicious_input = "../etc/passwd"

file_path = get_file_path(base_dir, malicious_input)
```

※他にもホワイトリストの設定などの対策はありえると思います。

このようなセキュリティを意識したコーディングをJupyter Notebookでの分析の段階でできるようになりました。
セキュリティを学んで良かったことの一つです。

「本番実装から意識すればいい」という意見もあり得るかと思いますが、セキュリティのシフトレフトという観点では、JupterNotebookなどでの分析段階からセキュリティを意識しています。

この「セキュリティのシフトレフト」を知ることができたのも良かったことの一つです。

## 学びの効率を上げる

セキュリティを勉強することで、コンピュータサイエンスに広く触れることができます。

セキュリティ分野を勉強することで、多くの領域で学習効率が上がりました。

AWSを勉強しても、コンテナを勉強しても、結局セキュリティの知識が必要です。

「情報処理安全確保支援士試験に向けて強度高くセキュリティの勉強をしたこと」が、この先の長いデータサイエンティスト/エンジニア人生で役に立つと思います。

## 大抵のエンジニアと技術で話せるようになった

思わぬ副産物でしたが、大抵のエンジニアと技術で話せるようになりました。

これまで、私が技術を通じて話せるのは同じデータサイエンス系、バックエンド系、アプリ開発系の方がほとんどでした。

セキュリティを学んだことで、インフラ系の方やセキュリティエンジニアの方など、言い出すとキリがないですが、たくさんのエンジニアと技術を通じてお話できるようになりました。

次の投稿を見て、共感とともに腑に落ちました。

https://twitter.com/yamadasecurity/status/1777334519504490980?s=46&t=1vjr-O7gzpoFo0rahWqUZg


## セキュリティに主体的になった

セキュリティを学ぶと、次第に上述のようなメリットが言語化できてきました。

結果、セキュリティに対してより主体的に取り組むようになりました。

セキュリティ施策について自分で調べ、実践できるようになりました。

今後も継続してセキュリティの勉強ができそうです。

## おわりに

この記事では、セキュリティを学ぶ理由や学んで良かったことを紹介しました。

長く使える武器を手に入れることができました。

セキュリティを学ぶモチベーションの向上に繋がれば幸いです。

それでは。


## 参考

https://security.openstack.org/guidelines/dg_using-file-paths.html

https://dev-dojo.jp/python/18/#anchor8