【AWS】セキュリティ向上その1

  • ・AWSログインの2段階認証
    上部の「サービス」-「IAM」を選択します。

    「ルートアカウントのMFAをアクティブ化」を行います。
    =2段階認証を行います。
    2段階認証にはiPhoneアプリの「Authy」を利用します。

    「ルートアカウントのMFAをアクティブ化」を選択し、
    「MFAの管理」ボタンを押下します。

    「仮想MFAデバイス」を選択し、「次のステップ」ボタンを押下します。
    説明を読んだら、「次のステップ」ボタンを押下します。

    QRコードを「Authy」で読み取ります。
    読み取ると6桁の数字が出るので、それを認証コード1へ、
    秒数経過でさらに6桁の数字が出るので、それを認証コード2へ。
    「仮想MFAのアクティブ化」ボタンを押下すると関連付けが完了します。

  • グループの作成
    上部の「サービス」-「IAM」を選択します。
    左側の「グループ」を選択します。
    「新しいグループの作成」ボタンを押下します。
    グループ名に任意の名前を入力し、「次のステップ」ボタンを押下します。
    ポリシーとして、「AmazonEC2FullAccess」を選択し、「次のステップ」ボタンを押下します。
    「グループの作成」ボタンを押下します。
  • IAMユーザーの作成
    AWSログインは今後、IAMユーザーと呼ばれる権限の低いユーザーで行えるようにします。
    これにより、iPhoneなどからAWSを起動したりします。

    上部の「サービス」-「IAM」を選択します。
    左側の「ユーザー」を選択します。
    「新規ユーザーの作成」ボタンを押下します。
    ユーザー名を1名分入力し、「作成」ボタンを押下します。

    認証情報を「認証情報のダウンロード」ボタンを押下し、ダウンロードしておきます。
    このファイル内の「Access Key Id」「Secret Access Key」は
    後程、iPhone用のAWS起動アプリで利用します。

  • ユーザーの詳細設定
    ユーザー名をクリックし、「グループにユーザーを追加」ボタンより、
    先ほど作成したグループに追加させます。
    次に下部の「パスワードの管理」ボタンを押下し、パスワードを設定します。

【AWS】EC2のインスタンス作成

AWS(AmazonWebService)が個人でも1年間無料とのことで利用してみました。
AWSのサイトでamazonのログインとパスワードでサインインし、
EC2でインスタンスを作成します。

  • 【手順1:Amazonマシンイメージ(AMI)】
    「Amazon Linux 64bit」を選択します。
    開発言語としては、Python、Ruby、Perl、Java
    リポジトリとしてはDocker
    DBとしてはMySQL、PostgreSQLなどが含まれているようです。

    また、使ったことはないですが、
    ローカルにAmazonコマンドラインインターフェース(AWS CLI)というツールを
    インストールしておくと、
    コマンドライン上から「aws 任意のコマンド」でAWSを操作できるようです。

  • 【手順2:インスタンスタイプの選択】
    無料利用枠の対象である「t2.micro」を選択します。
    「確認と作成」ボタンを押下します。
    手順3~手順6の手順は省略され、デフォルト設定が適用となります。
  • 【手順7:インスタンス作成の確認】
    「作成」ボタンを押下します。
    デフォルトのセキュリティグループはポート全開放されていますと、
    セキュリティ強化の警告が表示されますが、
    インスタンス作成時に手順3~手順6をすっ飛ばすと、
    自動的に新しいセキュリティグループが作成され、
    SSHのポート22のみを許可したセキュリティグループになります。

    常時起動するサーバーにしないため、許可する送信元も初期設定のままとします。

    ダイアログで「新しいキーペアの作成」を選択し、キーペア名を入力します。
    「インスタンスの作成」ボタンを押下します。

ものの5分程度の手順で仮想サーバーが作れるって
正直便利すぎると思いました。
予想請求額の通知を受け取る設定で0円より大きくなったら
通知を受け取るようにしておきます。(念のため)

【VPNサーバ】OpenVPN導入その6

約1年ずっと起動していたRaspberry Piもとうとう再起動しました。
それに伴い、iPhoneからRaspberry PiのOpenVPNを介して、
自宅サーバに接続しようと思ったところ、接続できなかったので設定を見直し。

  • iptablesの設定

    iptables -t filter -A INPUT -i eth0 -p udp -m udp --dport 1194 -j ACCEPT
    iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to 192.168.XXX.XXX
    

    「–to」にはRaspberry Piの通常のIPを指定します。
    再起動すると設定が消えるため、自動設定できるようにするのが良いですが、
    まだ自動化できていません。

設定後、ufw(iptable)の再起動は不要です。
この内容は「【Raspbian】OpenVPN導入その2」の最後の方にも記載がありますが、
見逃しがちなので、再度記載しました。

【Excel】フォルダ内のエクセルファイルに対して情報を取得する

Dir関数を用いるため、ネットワーク上の長いファイルパスには未対応です。

Sub Test()

'
' Test Macro
'
' フォルダ内のファイルに対して処理を行います。
'
    ' 画面チラつきを防止する。
    Application.ScreenUpdating = False

    ' フォルダパスとファイル名を宣言する。
    Dim strFilePath As String
    Dim strFileNmae As String
 
    ' テキストボックスかセル入力でフォルダを指定させる。
    strFilePath = "C:\Users\test\Desktop\テストディレクトリ"
    strFilePath = Worksheets("sheet1").Cells(2, 1).Value
    
    ' 末尾が\ではない場合、\を追加する。(未実装)
    strFilePath = strFilePath & "\"
    
    ' 指定フォルダ内のファイル名を取得する。
    strFileName = Dir(strFilePath, vbNormal)

    ' 結果シートをアクティブにする。
    Worksheets("sheet1").Activate
   
    ' 結果シートの行数を宣言する。
    Dim longGyo As Long
    longGyo = 3

    ' 指定フォルダ内のファイルがなくなるまで繰り返す。
    Do While strFileName <> ""
        
        ' 結果配列とシート数を宣言する。
        Dim strArr() As String
        Dim sheetCnt As Long

        ' ファイルを開く。
        With Workbooks.Open(Filename:=strFilePath & strFileName)

            ' ファイル内のシート数を取得する。
            sheetCnt = .Worksheets.Count

            ' ファイル内のシート数分+チェックしたい項目数分の2次元配列を確保する。
            ReDim strArr(1 To sheetCnt + 1, 10)
            
            ' 1シート目からnシート目まで繰り返す。
            Dim i As Long
            For i = 1 To sheetCnt
                strArr(i, 0) = .Worksheets(i).Name
                strArr(i, 1) = .Worksheets(i).Cells(3, 4).Value
                strArr(i, 2) = .Worksheets(i).PageSetup.LeftHeader
                strArr(i, 3) = .Worksheets(i).PageSetup.CenterHeader
                strArr(i, 4) = .Worksheets(i).PageSetup.RightHeader
                strArr(i, 5) = .Worksheets(i).PageSetup.LeftFooter
                strArr(i, 6) = .Worksheets(i).PageSetup.CenterFooter
                strArr(i, 7) = .Worksheets(i).PageSetup.RightFooter
                
                .Worksheets(i).Select
                strArr(i, 8) = ActiveWindow.Zoom
                strArr(i, 9) = ActiveCell.Address
            Next i
            
            ' 保存せずファイルを閉じる。
            .Close SaveChanges:=False
        End With

        ' 配列の1からnまで繰り返す。
        Dim j As Long
        For j = 1 To sheetCnt
            ' 結果シートのセルに各ファイルの各シートの値を設定する。
            Cells(longGyo, 1).Value = strFilePath & strFileName
            Cells(longGyo, 2).Value = strArr(j, 0)
            Cells(longGyo, 3).Value = strArr(j, 1)
            Cells(longGyo, 4).Value = strArr(j, 2)
            Cells(longGyo, 5).Value = strArr(j, 3)
            Cells(longGyo, 6).Value = strArr(j, 4)
            Cells(longGyo, 7).Value = strArr(j, 5)
            Cells(longGyo, 8).Value = strArr(j, 6)
            Cells(longGyo, 9).Value = strArr(j, 7)
            Cells(longGyo, 10).Value = strArr(j, 8)
            Cells(longGyo, 11).Value = strArr(j, 9)
            longGyo = longGyo + 1
        Next j

        ' 次のファイルを取得する。
        strFileName = Dir()
    Loop
        
    ' 画面チラつき防止を解除する。
    Application.ScreenUpdating = True
End Sub

【Excel】全シート分繰り返す

Sub Test()

'
' Test Macro
'
' 全シート分繰り返す。
'
    ' 画面のチラつきの防止設定を行う。
    Application.ScreenUpdating = False

    ' 全シート分繰り返す。
    Dim Sht As Worksheet
    For Each Sht In Worksheets
        ' シートを選択する。
        Sht.Select
        ' 処理を記述する。
        Msg "test"
    Next Sht

    ' 画面のチラつきの防止設定を元に戻す。
    Application.ScreenUpdating = True
End Sub

【Excel】選択セルの行列と選択セルの最終行列

Sub Test()

'
' Test Macro
'
' 行列を求める。
'
    ' 特定のセルを選択する。(i:行、j:列)
    ActiveSheet.Cells(i, j).Select

    ' 選択セルの行求める。
    MsgBox ActiveCell.Row

    ' 選択セルの列を求める。
    MsgBox Activecell.Column

    ' 選択セルの最終行を求める。
    MsgBox ActiveSheet.Cells(i, j).End(xlDown).Row

    ' 選択セルの最終列を求める。
    MsgBox ActiveSheet.Cells(i, j).End(xlToRight).Column

End Sub

【bat】エビデンスの取得効率化

少しでもエビデンスの取得を効率化するために、
下記手順でテストを行うことを想定。

  1. 01_BEFORE_UT.batを実行(第1引数にフォルダ名(ケース番号)を指定)
  2. テスト実行
  3. 02_AFTER_UT.batを実行(第1引数にフォルダ名(ケース番号)を指定)

DBはDB2としています。

  • 01_BAFORE_UT.bat

    @ECHO OFF
    REM 実行時の第1引数にエビデンス用のフォルダ名(ケース番号)を指定してください。
    REM コマンドプロンプトを立ち上げ、「db2cmd 01_BAFORE_UT.bat フォルダ名」で実行します。
    
    REM *************************************************************
    REM  エビデンスフォルダ設定
    REM *************************************************************
    SET EVI_DIR=%1
    SET SQL_OUTPUT=%EVI_DIR%\10_SQL_LOG_Before
    MKDIR %EVI_DIR%
    MKDIR %SQL_OUTPUT%
    
    REM *************************************************************
    REM  DB設定(各自の設定に変更してください。)
    REM *************************************************************
    SET SERVER_I=XXXXX
    SET USER_ID=YYYYY
    SET USER_PASS=ZZZZZ
    
    REM *************************************************************
    REM  DB2接続
    REM    -t:SQLファイル内のセミコロンをステートメント終了文字とする。
    REM    -v:コマンドテキストを標準出力にエコーする。
    REM *************************************************************
    db2 -tv connect to %SERVER_ID% user %USER_ID% using %USER_PASS%;
    
    REM *************************************************************
    REM  SQL実行
    REM    -t:SQLファイル内のセミコロンをステートメント終了文字とする。
    REM    -v:コマンドテキストを標準出力にエコーする。
    REM    -f:ファイル名を指定する。SQL文をファイルから読み込む。
    REM *************************************************************
    db2 -tvf select_AAA.sql > %SQL_OUTPUT%\select_AAA.log
    
    REM *************************************************************
    REM  DB2切断
    REM *************************************************************
    db2 connect reset
    
  • 02_AFTER_UT.bat

    @ECHO OFF
    REM 実行時の第1引数にエビデンス用のフォルダ名(ケース番号)を指定してください。
    REM コマンドプロンプトを立ち上げ、「db2cmd 02_AFTER_UT.bat フォルダ名」で実行します。
    
    REM *************************************************************
    REM  エビデンスフォルダ設定
    REM *************************************************************
    SET EVI_DIR=%1
    SET SQL_OUTPUT=%EVI_DIR%\20_SQL_LOG_After
    SET LOG_OUTPUT=%EVI_DIR%\30_BATCH_LOG
    MKDIR %SQL_OUTPUT%
    MKDIR %LOG_OUTPUT%
    
    REM *************************************************************
    REM  DB設定(各自の設定に変更してください。)
    REM *************************************************************
    SET SERVER_I=XXXXX
    SET USER_ID=YYYYY
    SET USER_PASS=ZZZZZ
    
    REM *************************************************************
    REM  DB2接続
    REM    -t:SQLファイル内のセミコロンをステートメント終了文字とする。
    REM    -v:コマンドテキストを標準出力にエコーする。
    REM *************************************************************
    db2 -tv connect to %SERVER_ID% user %USER_ID% using %USER_PASS%;
    
    REM *************************************************************
    REM  SQL実行
    REM    -t:SQLファイル内のセミコロンをステートメント終了文字とする。
    REM    -v:コマンドテキストを標準出力にエコーする。
    REM    -f:ファイル名を指定する。SQL文をファイルから読み込む。
    REM *************************************************************
    db2 -tvf select_AAA.sql > %SQL_OUTPUT%\select_AAA.log
    
    REM *************************************************************
    REM  DB2切断
    REM *************************************************************
    db2 connect reset
    
    REM *************************************************************
    REM  ログファイル取得
    REM *************************************************************
    copy \\サーバーホスト名\12345\xxxx.log %LOG_OUTPUT%
    

基本的な確認コマンドその1

  • OSのバージョン確認

    cat /etc/issue
    CentOS release 6.6 (Final)
    Kernel \r on an \m
    
  • OSのbit数確認

    uname -a
    Linux z-area.net 2.6.32-504.23.4.el6.x86_64 #1 SMP Tue Jun 9 20:57:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
    

【Java】jarファイル付のJavaコンパイル

基本的なことをメモ。

  • 前提条件
    /home/testにjarファイル、Javaファイルがある。
    Javaファイルは処理内でjarファイル内のメソッドを利用する。
  • コンパイルと実行

    cd /home/test
    javac -cp .:./jarファイル javaファイル
    java -cp .:./jarファイル クラス名
    
  • クラスパスの区切り文字
    Linuxはコロンになる。
    Windowsはセミコロンになる。
  • 実行時のルートパス
    実行時に-cp指定がないとJAVA_HOMEがルートになる。
    .を指定することで現在いるディレクトリがルートになる。

【jQuery】動的追加したオブジェクトにイベントを設定

jQueryでオブジェクト(ボタンやリンク)にイベントを設定した場合、
画面表示時点で存在しているオブジェクトを押下すると
設定したイベントがもちろん実行されますが、
動的追加したオブジェクトでは押下しても設定したイベントが
実行されない事象があったので、解決策をメモしておきます。


  • 下記のようなHTML(Thymeleaf)があると仮定し、
    追加ボタンを押下すると行(<tr>~</tr>)が追加されるとする。

    <table class="table">
      <thead>
        <tr>
          <th><span th:text="${no}"></span></th>
          <th><span th:text="${gaiyou}"></span></th>
          <th><span th:text="${naiyou}"></span></th>
          <th><span th:text="${link}"></span></th>
          <th><span th:text="${aruaru}"></span></th>
        </tr>
      </thead>
      <tbody id="van-tbody">
        <tr th:each="van : ${vanAll}" >
          <td><span th:text="${van.no}"></span></td>
          <td><span th:text="${van.gaiyou}"></span></td>
          <td><span th:text="${van.naiyou}"></span></td>
          <td><span th:text="${link}"></span></td>
          <td>
            <span th:text="${van.aruaru}"></span><button id="button-plus + '${van.no}'" type="button" class="btn btn-plus"><span class="glyphicon glyphicon-plus-sign"></span></button>
          </td>
        </tr>
      </tbody>
    </table>
    
  • オブジェクトのイベント設定(静的)
    上記HTMLにおいて初期状態で2行分があるとし、
    その2行分のみにイベントを設定する場合、下記のようなイベント設定で問題なし。

    • clickメソッド
      古いタイプのイベント設定方法。
      「button」に設定してしまうとテーブル外のボタンにもイベントが設定されてしまうので、
      テーブル内のボタンだけが利用しているスタイルシート「btn-plus」にイベントを設定している。

      <script type="text/javascript">
      <!--
      $(document).ready(function() {
        $('.bth-plus').click(function() {
          alert('クリックしました');
        });
      });
      -->
      </script>
      
    • onメソッド
      新しいタイプのイベント設定方法。
      こちらの設定方法が推奨されており、「バインド」と呼ばれる。
      onメソッドの第1引数はスペースで区切れば複数のイベントも設定可能。
      例:’click keyup’

      <script type="text/javascript">
      <!--
      $(document).ready(function() {
        $('.bth-plus').on('click', function(){
          alert('クリックしました');
        });
      });
      -->
      </script>
      
  • オブジェクトのイベント設定(動的)
    上記HTMLにおいて初期状態で2行分があるとし、
    3行目、4行目と増えてもイベントを動作させたい場合、
    下記のようにイベント自体は親に設定しておいて、
    onメソッドの第2引数に本来イベントを設定したいオブジェクトを指定します。

    • onメソッド(第2引数追加版)
      このような設定方法を「デリゲート」という。

      <script type="text/javascript">
      <!--
      $(document).ready(function() {
        $('table').on('click', '.btn-plus', function(){
          alert('クリックしました');
        });
      });
      -->
      </script>