お疲れ様です。エムスリーの山本です。
各種の業務を担当させていただいておりますが、今回はセキュリティについて書かせていただきたいと思います。このブログはエムスリー Advent Calendar 2025 5日目の記事になります。
今回のお題は「生成AI x セキュリティアセスメントシート」です。
セキュリティアセスメントシート
セキュリティアセスメントシートとは、各社が取引先のシステムを利用する際にその状況を確認するために送付し、その回答を得るものです。 シートでチェックされる項目は各社ごとに個別であることもありますが、大まかには似通ったものを聞かれることがあります。アセスメントシートへの回答は重要なものですが、「毎回似たことに答えつつ、少しずつ違っている」と思うことはあります。
ここに、工数をかけ過ぎずに精度を上げていくという話を書いていきたいと思います。
実際に人力で一度真面目に答えてみる
まず、自分で自社のサービスについてのアセスメントを一旦実施してみました。大抵の場合はすでに各種のアセスメントシートを受け取っているはずです。そちらを取りまとめて1つの大きなアセスメントシートとし、自社のサービスの状態について詳しく記述してみます。
以下に例示します。
なお、これはエムスリーの実例ではなく、仮想の企業のものとなります。
| 質問項目 | 回答 | 補足・詳細 |
|---|---|---|
| I. 組織・方針(マネジメント) | ||
| I-1 方針・規定 情報セキュリティポリシー、またはこれに準ずる内部規定を文書化し、全従業員に周知していますか。 |
Yes | ISO/IEC 27001に沿って情報セキュリティポリシーを策定し、またこれを公に公開しています。 https://example.com/secpolicy.html 年次でポリシーの変更についてチェックしており、直近では個人情報保護法の改正の際には修正をしています。 |
| I-2 責任体制 情報セキュリティに関する責任者(CISOなど)を明確に定め、その役割と権限を明文化していますか。 |
Yes | 全体を統括する情報セキュリティ責任者を一名定めており、その上で各部門ごとに情報セキュリティ管理者を設置しています。これらのメンバー構成や権限についてはISO 27001に沿った文書によってまとめられており、名簿は情報セキュリティ委員名簿、権限はISMSマニュアルに規定されています。「当社の情報セキュリティ基本方針を全社展開する総責任者であり、情報セキュリティ委員会の委員長を兼務する。情報セキュリティ責任者は、経営者が任命する」「当社の情報セキュリティ活動を推進するための活動の実施を管理する者」などといった規定となっております。 |
| I-3 教育・訓練 全従業員(役員含む)に対し、年1回以上の定期的なセキュリティ教育・訓練を実施していますか。 |
Yes | 最低年1回はセキュリティ教育の場を設けております。また、定期的なものに加えて入社時にも必ず同様のものを受講することを求めております。具体的には動画閲覧やその後のクイズなどであり、当社特有の規定あるいは一般的なセキュリティ事象に対しての理解を深めてもらっています。 |
| I-4 監査・レビュー 内部監査または外部監査により、セキュリティ対策の有効性を年1回以上レビューしていますか。 |
Yes | ISO 27001の認証を取得しており、その意味でのチェックがある他、各部門ごとに内部監査を行なっております。内部監査の結果はマネジメントレビューを経て期の情報セキュリティ施策に生かされる形となります。 |
| II. 物理的セキュリティ | ||
| II-1 入退室管理 サーバー室、データセンター、機密文書保管エリア等への入退室について、記録・認証を伴う管理を行っていますか。 |
Yes | 執務室への入室は電子ロックによる施錠が前提となっております。弊社にはサーバ室はありませんが、社内ネットワーク機器は施錠されたラック内に設置されており、鍵は責任者が管理します。パブリッククラウドを利用しているためデータセンターは直接的には利用しておりません。 |
| II-2 機器の保護 サーバー、ネットワーク機器等の重要なIT資産について、物理的な盗難・損傷からの保護対策(施錠、UPSなど)を講じていますか。 |
Yes | ラックは施錠されております。UPSは設置されておりませんが、短時間であれば冗長化された外部クラウドサービスやバックアップ体制により業務継続が可能であると評価しました。 |
| III. 技術的セキュリティ | ||
| III-1 脆弱性管理 OS、ミドルウェア、アプリケーション等について、脆弱性情報を継続的に収集し、パッチ適用や設定変更を遅滞なく行っていますか。 |
Yes | いわゆるサーバそのものは管理しておらずコンテナを利用しています。コンテナは常に最新の公式イメージをベースにするように作成していることで脆弱性情報を直接的に収集することなくリスクを軽減しています。アプリケーションで利用するライブラリに関しては、GitHubでDependabotを常に動作させており、発見した問題については定期的に修正(隔週のリリース)、あるいはトリアージの上で(問題がワークアラウンドによって発動しないことをセキュリティチーム確認の上で)対応しないことを決定しています。 |
| III-2 マルウェア対策 全ての端末(サーバー、PC等)で、最新の状態に更新されたマルウェア対策ソフトウェアを導入・運用していますか。 |
Yes | 社員用PCについては社内ポリシーに沿って、マルウェア対策ソフトを導入しており、また最新のシグネチャが適用されるように設定しています。クラウドコンテナについては、領域をRead Onlyとしているため導入の必要はない状態となっております。 |
| III-3 アクセス制御 業務上必要な権限のみを付与する最小権限の原則に基づき、システムへのアクセス権を管理・設定していますか。 |
Yes | システムの種類ごとに各種の対策をとっております。弊社のSaaSについては権限をロールによって柔軟に制御可能となっております。このロールの使い方自体はクライアント様の体制によって決定されますが、必要に応じて例えば数名の管理者による利用ならば大きな権限をロールによって与え、組織ごとに各種管理者が存在するならば組織ごとにのみアクセス権を与えることが可能です。また、当該SaaSを動かすパブリッククラウドに関しては弊社社員がアクセス権を持ちますが、業務に必要なエンジニア数名のみがアクセス権を保持しております。障害対応などの業務上どうしても必要となりうるためそのメンバーは管理者権限を保持しますが、数名にとどまります。また、MFAを強制しているため外部への漏洩リスクの広がりに対しての対処はなされています。 |
| III-4 認証 重要なシステムへのアクセスに際し、多要素認証(MFA)またはこれに準ずる強力な認証手段を導入していますか。 |
一部Yes | 弊社のSaaSはMFAには対応しておりませんが、IPアドレス制限をつけることは可能となっております。また、パスワード要件として文字数や文字種などの指定を設定することが可能となっており、パスワードミスに対するのロック等の機能も有しております。 |
| III-5 ログ管理 重要な情報システムへのアクセス、操作、障害発生時のログを改ざん防止措置を講じたうえで3か月以上保持していますか。 |
Yes | サーバのログは全てクラウド上のマネージドなログシステムに流されます。また、基本的には恒久保存ですが一部のログ(例えば大量となるDBログ等)については90日保存となります。 |
| IV. インシデント・事業継続 | ||
| IV-1 インシデント対応 セキュリティインシデント(情報漏洩、不正アクセス等)発生時の緊急対応手順を策定し、対応体制を整備していますか。 |
Yes | ISO 27001に沿って緊急対応の場合のフローが規定されております。その中で対策本部やその構成が規定されます。また連絡先一覧がメンテナンスされています。技術的な部分に関してはそのための文書管理をすること自体が規定に定められており、エンジニアによって独自に文書が管理されております。エンジニア管理文書については技術的な事項のみの記載となっておりますが、インシデント対応という性質上、事象に対する網羅的な対策というよりも一般的な事項や事例にとどまります。 |
| IV-2 バックアップ 業務継続に必要なデータについて、定期的なバックアップを取得し、復旧手順のテストを年1回以上実施していますか。 |
No | 定期的なDBバックアップは取得しており、マネージドなサービスを利用して日次で取得しております。またコードやクラウド設定についてはパブリッククラウド側の冗長化がバックアップと同義と考えております。復旧のテストについては定期実施しておりません。しかし、DBのリストア自体は確認済であり、またIaC化を進めたコンテナシステムであるため日常的な作業がバックアップ復旧に相当すると考えています。 |
| V. 貴社情報の取り扱い(委託特定項目) | ||
| V-1 委託時規程 貴社から提供された情報を「機密情報」として扱い、利用目的以外に利用しないことを定める内部規程・契約を整備していますか。 |
Yes | 該当する特定の内部規定はありませんが、利用規約によって提供された情報の利用目的については規定されております。また、それに沿って内部的に運用されています。 |
| V-2 開発環境分離 貴社システムに関わる開発・テスト環境と、本番環境または自社システムのネットワークを分離していますか。 |
Yes | 分離しております。実際にサービスを提供するパブリッククラウドにおいてはそのアカウント単位での分離となっており、一方の問題が他方に影響する、あるいは本番データが開発環境にあるといった問題は発生しません。 |
普通よりあえて丁寧にアセスメントの際には求められていないくらいの量を書いています。また、良いことと言いますか、ちゃんとやっていること、社内でやっている対策をどんどん盛り込んで書いてあります。
生成AIによる回答提案
この詳細な回答は手間ですが、この標準的回答を作成することが、生成AI利用で役に立ちます。
そもそもセキュリティアセスメントというのは「全てが完璧です」と答えることができればベストとはいえ、「リスクを認識して、度合いを見積り、なんらかの別の対策によって賄う」ことも含めて評価ポイントとなります。「なんらかの対策」としてやっていることを情報として盛り込んだことでそこにも手が届く回答が可能となるのです。
例えば、「暗号化ができていないストレージが現時点ではあるが、これについては暗号化されたディスク自体を施錠したラック内に格納しており、またこのストレージに入るデータには個人情報は入らないのでリスクは許容可能です。」のような回答が考えられるのです。
では、これを生成AIに処理させてみましょう。
NotebookLM
簡単な方法として先ほどのシートをGoogle Spreadsheetに保存した上で NotebookLMに読ませました。

この文書を元にして「バックアップイメージの保護はできているか」を確認して次のような回答を得ました。ほぼ満点です。

似た例ですが「組織外から入手するソフトウェアパッケージ、ライブラリ、その他のバージョンが適切に管理されている状態にあるか?」を聞いてみます。元シートには「OS、ミドルウェア、アプリケーション等について、脆弱性情報を継続的に収集し、パッチ適用や設定変更を遅滞なく行っていますか」に対応する回答がありましたのでこれを流用してもらえました。

次に元文書に直接的に記述がないものを聞いてみます。「経路は暗号化されているか?」と。

当然ですが、書いていないものは答えられません。 そこで私は元文書(スプレッドシート)に対して次のような質問回答項目回答を追加します。
| 質問項目 | 回答 | 補足・詳細 |
|---|---|---|
| III-6 経路暗号化 個人情報その他を含めたすべての情報の経路は暗号化されているか? されているとしてどのような方式で暗号化されているか。 |
Yes | Webの通信チャネルにおいて、TLS 1.2以上を適用した HTTPS接続を必須としています。CiperSuiteとしても2025年11月時点で最新に近いもののみを利用しており、例えばRSA鍵交換、AES以外の暗号化、SHA1、CBCモード等の利用はできません。 また、メールの送信がありますが、これは相手サーバーの対応状況に依存する日和見暗号化(Opportunistic TLS) を利用していますが、相手サーバが対応していればもちろんセキュアなチャネルです。 |
その上でNotebook LMを同期して再質問。当たり前ですが回答が更新されます。そして満点です。 私の長ったらしい回答もそれなりに要約されて冗長さがなくなっています。

このように、元のシートを育てると似たような質問が多い(が少し異なる)アセスメントシートに対しても一定の回答が可能となります。
いくつも回答を積み重ねて元々の文書を大きくしていくと、それを知識ベースとして回答の正確性も増すということになります。これが先に挙げた丁寧な解答の意味です。
セキュリティアセスメントシートに対して「はい」「いいえ」等の簡単な回答をする場合もあるでしょうが、「データは暗号化されているか」のような質問に対して「Yes」とした上で備考として「XXXの部分は暗号化非対応だがXXXによって担保される」のような回答ができるわけです。これに「Yes」とだけ答えると一部不正確になりますし、「No」と答えるとせっかくの施策が無駄になります。これを毎回懇切丁寧に書くのには工数がかかりますが、生成AIアシストで一定の長い文章でも容易に書けることが自社、そしてお客様にもメリットと言えるでしょう。
しかし信用できるのか?
しかし、お客様に提出するシートです。いくつも試しましたが、生成AIの常として「書いてもいないことを創造する」という事象もありました。今回の入力例とは異なる入力であり、出力も実際のものとは少々改変していますが、こんな回答をした例があります。
ランサムウェア攻撃に対する耐障害性を考慮し、システムバックアップデータはクロスリージョンレプリケーションを行います。このレプリカはS3オブジェクトロックによる不変性を持ち、rootを含めてデータの侵害は不可能です。
元々読み込ませた文書にはAWS Backupでクロスリージョンでのバックアップを行う記述があったのですが、いつの間にかS3オブジェクトロックが追加されていました。
要するに、正しそうなことを言うが言い過ぎることもあるということは念頭におく必要があります。プロンプトの工夫で修正可能なものもあるでしょうが、だとしてもいつ大嘘を書き始めるかわからないということは認識する必要があります。
私は「必ず人間の目で見て文章を確認・修正する」ということを実施しており、ノーチェックで通すことをしたことはありませんし、通すべきだとも思っていません。
GASからの利用で回答自体を自動化
NotebookLMでの利用は簡単ですし、シェアすれば他のユーザでも使えます。ですので、一次回答を別の方にお願いしてその上でエンジニアや法務が本格的にチェックするというようなことも可能です。
私はその上でGAS(Google Apps Script)での回答を現在は模索しています。またNotebookLMで使ったようなゴールデンイメージ的な模範解答集を構成せず、過去のアセスメントシート回答を入力としてそのまま使うことも試みています。特定のGoogleドライブのフォルダにアセスメントシート回答をGoogle Spreadsheetの形で集約しておいて、それを常に参照させるのです。
これによって幸せサイクルが回ることを期待し、Nano bananaに幸せイメージをつくらせてみました。

大まかな処理の流れは以下です。GASはGeminiに生成させてみました。
- 初期化
fillAnswersWithKnowledge()- Google Driveの知識源フォルダから全ファイルを読み込み、Geminiを呼び出して一問一答(
summarizedKnowledge)に要約
- Google Driveの知識源フォルダから全ファイルを読み込み、Geminiを呼び出して一問一答(
scanAndFillSheet()summarizedKnowledgeと対象シート(回答すべきシート)を受け取る- シートで
GEMINI_ANSWERと書かれたセルを見つけたらそのすべての左セルを連結して質問とみなす summarizedKnowledgeと質問を組み合わせてGeminiに呼びかけてGEMINI_ANSWERセルを回答で置き換える
ここをクリックするとコードが表示されます(省略部分も多く、概要のみです)
/** * 知識源フォルダの全ファイルを読み込み、Geminiで要約し、その知識を元に * 指定されたスプレッドシートの "GEMINI_ANSWER" セルをすべて埋めます。 * この関数をシート上のボタンに割り当ててください。 */ function fillAnswersWithKnowledge() { const ui = SpreadsheetApp.getUi(); // ====================================================================== // 1. 回答先スプレッドシートURLの入力とIDの抽出 (ポップアップで実行) // ====================================================================== const response = ui.prompt( '回答先スプレッドシートの指定', '回答を書き込みたいスプレッドシートのURLまたはIDを貼り付けてください。', ui.ButtonSet.OK_CANCEL); if (response.getSelectedButton() !== ui.Button.OK) { return; } const targetInput = response.getResponseText().trim(); const targetSpreadsheetId = extractIdFromUrl(targetInput); // IDを自動抽出 if (!targetSpreadsheetId) { ui.alert("エラー", "入力されたURLまたはIDが正しくありません。", ui.ButtonSet.OK); return; } // ====================================================================== // 2. 知識源となるファイルの内容を抽出・結合 (固定IDを使用) // ====================================================================== // 💡 フォルダIDを直接渡し、ファイル数の制限なく全ファイルを処理 const rawKnowledge = compileRawKnowledge(KNOWLEDGE_FOLDER_ID); // ====================================================================== // 3. 抽出した内容をGeminiで「要約」させる // ====================================================================== const summaryPrompt = ` あなたは、セキュリティアセスメントの専門家であり、提供された過去の回答事例文書(複数のファイル)から、**新しいクライアントの質問に即座に回答するため**の「ナレッジベース」を構築するタスクを負っています。 ** 【前提知識】 1. これはXXXXXXシステムのSaaSであるXXXXXXと呼ばれるシステムについてのセキュリティアセスメントです。 2. このSaaSはAWSで動作しているウェブシステムであり、XXXXに関わる機微情報を含めて大量のデータを扱います。特に従業員はXXXも可能です。 3. クライアントから質問を受け、社内で回答を作成して今読み込まれている文書が作られました。 4. 一般に質問のセルがあり、その右側に回答セルが作成されるという形となっており、この質問と回答がペアとなります。 **【タスクと形式の指示】** 1. 文書全体から、**セキュリティポリシー、コンプライアンス、具体的な対策手順**に関する全ての事実情報(数値、基準、担当部署など)を抽出してください。 2. 上記から、一問一答の形で知識を抽出してください。似た質問は統合して一つの回答を作成してください。 3. **あいまいな記述や、一般的な概念の説明は排除**し、事実ベースの断定的な情報のみを残してください。 --- 統合対象の文書 --- ${rawKnowledge}`; Logger.log("知識源の要約を開始します..."); const summarizedKnowledge = getGeminiAnswer(summaryPrompt); if (!summarizedKnowledge || summarizedKnowledge.startsWith("❌")) { ui.alert("エラー", "知識源の要約に失敗しました。APIエラーまたはトークン制限超過の可能性があります。ログを確認してください。", ui.ButtonSet.OK); return; } Logger.log("知識源の要約が完了しました。要約の長さ: " + summarizedKnowledge.length + " 文字"); // ====================================================================== // 4. 回答シートを処理 // ====================================================================== try { const targetSs = SpreadsheetApp.openById(targetSpreadsheetId); // 全てのシートを処理 const allSheets = targetSs.getSheets(); for (const sheet of allSheets) { scanAndFillSheet(sheet, summarizedKnowledge); } ui.alert("完了", `指定されたスプレッドシート (${targetSs.getName()}) の全てのシートの処理が完了しました。`, ui.ButtonSet.OK); } catch (e) { ui.alert("エラー", `回答先スプレッドシートID (${targetSpreadsheetId}) が正しくないか、アクセス権がありません。エラー詳細: ${e.message}`, ui.ButtonSet.OK); } } // ---------------------------------------------------------------------- // --- 新規/修正ヘルパー関数 --- // ---------------------------------------------------------------------- // --- 設定の追加 --- // 💡 一時的に読み取る知識源ファイルの最大数を設定します。 // 全ファイルを読み込みたい場合は、この行をコメントアウトするか、非常に大きな数値に設定してください。 const MAX_KNOWLEDGE_FILES = 50; // ----------------- /** * フォルダIDからすべてのファイルの内容を抽出し、一つの大きな文字列に結合して返す。 * MAX_KNOWLEDGE_FILES の設定に従って、処理するファイル数を制限します。 * @param {string} folderId - 知識源フォルダのID * @return {string | null} 全ファイルの内容テキストの結合、またはエラー時はnull */ function compileRawKnowledge(folderId) { .... } // ---------------------------------------------------------------------- // --- ヘルパー関数群 --- // ---------------------------------------------------------------------- /** * フォルダIDから最初のファイルの内容を抽出し、文字列として返す。 * @param {string} folderId - 知識源フォルダのID * @return {string | null} ファイルの内容テキスト */ function getKnowledgeContent(folderId) { ... } // ---------------------------------------------------------------------- /** * 💡 Gemini APIを呼び出し */ function getGeminiAnswer(prompt) { ... } /** * シート全体をスキャンし、"GEMINI_ANSWER" セルをすべて処理する。 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet - 処理対象のシート * @param {string} knowledge - Geminiに提供する統合・要約済みの知識源テキスト */ function scanAndFillSheet(sheet, knowledge) { // 💡 必須: シートのデータ範囲を取得し、値の二次元配列を読み込む const range = sheet.getDataRange(); const values = range.getValues(); const numRows = values.length; const numCols = values[0].length; // 処理すべきデータがなければ終了 if (numRows === 0 || numCols === 0) { Logger.log(`シート ${sheet.getName()} に処理すべきデータがありません。`); return; } const systemInstruction = ` あなたは、提供された**過去のセキュリティチェックシートの回答事例**を知識源とする、**クラウドセキュリティの専門コンサルタント**です。 以下の制約を厳守して、クライアントからの問い合わせに回答してください。 ** 【前提知識】 1. これはXXXXのSaaSであるXXXXと呼ばれるシステムについてのセキュリティアセスメントです。 2. このSaaSはAWSで動作しているウェブシステムであり、XXXXを含めて大量のデータを扱います。特に従業員はXXXXも可能です。 3. クライアントはこのシステムを導入すべきかどうかを判定する必要があり、そのためにあなたにアセスメントを頼んでいます。 **【厳守事項】** 0. 回答文字数は数十文字から多くても200文字程度。どうしても必要な際でも400文字以下としてください。 1. 回答は、**クライアントの質問・要件**に直接、具体的かつ簡潔に答える形式をとってください。挨拶や自己紹介は厳禁です。質問への回答・あるいは要件の充足状況と付加情報のみを書いてください。 2. 知識源の中に、質問に答えるための情報が**一切見当たらない場合**は、必ず「**情報不足により回答できません**」とだけ述べてください。 `; for (let i = 0; i < numRows; i++) { ... const combinedQuestionText = findQuestionInRow(sheet, i + 1, j + 1); ... // 💡 1回のプロンプトで「質問判断・抽出」と「回答生成」をすべて依頼する const fullPrompt = systemInstruction + "\n\n--- 知識源(過去のアセスメント回答データ)---\n" + knowledge + "\n\n--- クライアントからの質問・要件(この質問にのみ回答せよ)---\n" + combinedQuestionText; const answerText = getGeminiAnswer(fullPrompt); ... } } /** * ファイルの種類に応じて、ファイルの内容を純粋なテキストとして抽出する関数。 * 💡 スプレッドシートの場合は、ファイル内の全てのシートの内容を結合します。 * @param {GoogleAppsScript.Drive.File} file - 抽出対象のファイルオブジェクト * @return {string | null} ファイルの内容テキスト、または抽出できない場合はnull */ function extractFileContent(file) { ... } // ---------------------------------------------------------------------- /** * 回答トリガーの左側にあるA列までの全てのセルを探し、結合して内容を返す。 * (空白セルがあっても停止せず、質問の境界判断はGeminiに委ねる) * * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet - 検索対象のシート * @param {number} row - 検索する行番号 (1-based) * @param {number} col - 検索を開始する列番号 (1-based, トリガーセルの列) * @return {string | null} A列からトリガーセルの左側までの全セル内容の結合 */ function findQuestionInRow(sheet, row, col) { ... } /** * URLまたはIDから、GoogleスプレッドシートのIDを抽出する。 * @param {string} input - URLまたはID文字列 * @return {string | null} 抽出されたID、または失敗時はnull */ function extractIdFromUrl(input) { ... } /** * スプレッドシートが開かれたときにカスタムメニューを追加する。 * 💡 回答実行のメニュー項目のみを残します。 */ function onOpen() { ... }
いくつか試してみましたが、少なくとも下書きとしては上出来でした。埋めてもらいたいところに GEMINI_ANSWER と書いておくだけであとはGASを起動するだけです。
ただ、「下書きとしては」であってそれなりに手を加えて提出しています。また長文になれば正確になるとも書きましたが、プロンプトで指示しても異常量の長さで書いてしまう現象もあります。さすがに長文にも限度はあります。
なお、まだ各所で活用するというところには至っておらず、現状では私が実施するセキュリティアセスメントにおいて利用しています。
まとめ
- 模範回答ゴールデンイメージを極めて詳しく作成しておくことで、生成AIによって詳細な説明を伴う新規回答を生成可能
- 回答できないものがあれば、再度人間の手で模範回答を作ることでさらに能力が強化される
- GASを利用することで回答の穴埋め自体も自動化することは可能
- 模範解答がない場合も、過去のセキュリティアセスメントシートを生成AIの入力として利用可能
- 生成AIは例によって嘘をつくので人間の目は必須
これによって労力をそれほど費やすことなく、精細な回答を生成しやすくなります。つまり生成AIアシストで適切な備考説明を加えることで過度に約束したり、あるいは過度にできることを小さく伝えたりすることがなくなるというのがポイントだと考えています。
We are Hiring!
エムスリーではセキュリティエンジニアを募集中です。 もしセキュリティの仕事に興味をお持ちいただけたならぜひ詳細をご確認ください。セキュリティ以外にも多数の職種がありますので他の職種ももちろん大歓迎です!