【Linux】opensslコマンドでTLSバージョンを指定して疎通確認


TLS脆弱性が懸念されバージョンを1.2のみ使用することにし、他のバージョンの利用を停止するみたいな作業を行いました。


動作確認のためにサーバに対して、TLSのバージョン1.0および1.1で通信ができない事を確認することになり、opensslコマンドで検証することになりました。


その時の備忘録です。

opensslコマンドって?

opensslコマンドはSSLおよびTLSの機能が実装したプログラムでオープンソースソフトウェアとして公開されています!

以下の機能があります。

  1. 公開鍵暗号化操作
  2. メッセージダイジェストの計算
  3. 暗号化と復号化
  4. TLSクライアントとサーバーテスト

など。


インストール方法

[root@server ~]#yum -y install openssl

TLSのバージョンを指定して疎通確認をする

私はTLS1.0とTLS1.1の使用を停止するようにしたので、これらで通信ができないことを確認することにしました。


opensslでTLSのバージョンを指定して疎通を確認するには下記のコマンドを実施します。

[root@xxx-xxx]#openssl -connect 127.0.0.1:443 -tls1 ←TLSのバージョンを指定

127.0.0.1に指定することで自分のサーバに向けて実行にしていますが、ホスト名とかにして他のサーバの疎通確認もできるようです。

一番右の-tlsXXでTLSのバージョンを指定できます。


TLSの通信ができない場合は下記のような感じで返ってきます
※一部抜粋です。

[root@xxx-xxx]#openssl -connect 127.0.0.1:443 -tls1


---
no peer certicate available

---
No client certificate CA names sent

---
SSL handshake has read xxx bytes and written xxx bytes

---

New, (NONE), Ciper is (NONE)

Secure Renegotiation IS NOT supported

SSL-Session
       Protocol    :     TLS1

証明書がないよ!サポートされてないよという感じで返ってきます。


TLS1.2で通信できるかも確認

上記のコマンドと結果でTLS1.2が通信できるかの動作確認も行いました。

コマンドは先ほどと同じです。TLSのバージョンをTLS1.2を指定します。

[root@xxx-xxx]#openssl -connect 127.0.0.1:443 -tls1_2

実行するとこんな感じで返ってきました。

[root@xxx-xxx]#openssl -connect 127.0.0.1:443 -tls1_2


---
Server certificate
------BEGIN CERTIFICATE------
xxxxx.........
.........
.........

---
SSL handshake has read xxxx bytes and written xxx bytes
New, TLSv1/TLSv3, Ciper is(XXXX-XXX-XXX)

Secure Renegotiation IS supported

SSL-Session
       Protocol    :     TLS1.2
       .....
       .....

サポートはしていて、証明書の内容みたいなのもドッと流れてきます。

TLSのバージョンを指定するオプションたち

オプション 説明
-tls1 tls1.0を使用
-tls1_1 tls1.1を使用
-tls1_2 tls1.2を使用
-no_tls1 tls1.0を無効
-no_tls1_1 tls1.1を無効
-no_tls1_" tls1.2を無効

さいご

最後まで読んでいただき、ありがとうございました。

もし、記載している内容が間違えていれば遠慮なくコメントしてください!
私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので💦

【Linux】Linux標準のファイアウォール「iptables」の仕組み


iptablesについて通信を制御しているというのはなんとなくで認識していたんですが、そもそも設定になっているのかなど仕組を知って設定してます?って現場のベテランに言われて頭が白くなったので備忘録程度に残しておきます。

iptablesLinux標準のファイアウォール


まず、iptablesという物自体についてです。

iptablesLinuxのkernel2.4以降に標準インストールされている、標準のファイアウォールです。

Linuxにインストールされているiptablesは「パケットフィルタリング型」のファイアウォールになります。

iptablesの設定はどのファイルを修正すれば良い?


iptablesの設定を変更するには「/etc/sysconfig/iptables」を修正します。

このファイルはLinux起動時にiptablesに設定する内容になります。

下記のコマンドを使用して修正することもできます。

iptables [-t テーブル]  コマンド [マッチ]  [ターゲット/ジャンプ]

設定を変更したらiptablesをリロードする

iptablesの設定を変更したら反映するためにiptablesをリロードする必要があります。


下記のコマンドで可能です。

service iptables restart

現在適用されている設定を確認するには下記のコマンドを実行します。

iptables -nL

iptablesはコマンドで修正することもあれば、ファイルを直接編集したりする。

iptablesの構成図

iptablesは下記の図のようにiptables->Tables->Chains->Rulesの構成になっています。

iptablesの4つのテーブル

iptablesは下記の4つのテーブルに分かれていて、制御しています。

  • filterテーブル

  • natテーブル

  • mangleテーブル

  • rawテーブル

  • それぞれのテーブルについてざっくり紹介していきます。

    filterテーブル

    filterテーブルはパケットを通過する、パケットを遮断するなどの設定を記述するセクションです。


    通常はほとんどの設定がここのセクションに記述されます。

    *filter
    ....
    ....
    COMMIT
    

    行の初めに*を付けて始まり、最後はCOMMITを指定。

    1. 入力に対して受け付ける設定をする場合(ファイル編集)
    *filter
    :INPUT ACCEPT[0:0]
    COMMIT
    
    1. 入力に対して受け付ける設定をする場合(コマンド)
    iptables -t filter -p tcp --dport 80 -j ACCEPT
    

    natテーブル

    natテーブルはNAT(ネットワーク変換機能)を担います。


    送信先/送信元のパケットの中身を書き換えるときに利用します。


    各通信をローカルのサーバへ振り分けるルーターとしての使う事も出来ます。

    *nat
    #natについて記述する
    COMMIT
    

    mangleテーブル

    パケットのIPヘッダで定義されているType Of Service(TOS)フィールドの値などを書き換えます。


    TOSフィールドはパケット処理の優先度付けを行い、通信の品質を制御するQuality of Service(QoS)に利用されます。

    *mangle
    #mangleの関係について記述する
    COMMIT
    

    rawテーブル

    RawテーブルはNOTRACKターゲットと組み合わせて、接続のトラッキングから除外した構成をするために使用されます。

    *rae
    #rawの関係について記述する
    COMMIT
    

    チェインの役割

    チェイン 役割
    PREROUTING 受信時の宛先アドレスを変換するチェイン
    INPUT 入力(受信)に対するチェイン
    OUTPUT 出力(受信)に対するチェイン
    FORWARD 転送に対するチェイン
    POSTROUTING 送信時に送信元アドレスを変換するチェイン

    テーブルごとに使えるチェイン

    filterテーブル INPUT,OUTPUT,FORWARD
    natテーブル POSTROUTING,PREROUTING,OUTPUT
    mangleテーブル POSTROUTING,PREROUTING,INPUT,OUTPUT,FORWARD
    rawテーブル PREROUTING,OUTPUT

    さいご

    最後まで読んでいただき、ありがとうございました。


    もし、記載している内容が間違えていれば遠慮なくコメントしてください!
    私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので💦


    ↓オススメ書籍↓

    スッキリわかるJava入門第3版 [ 中山清喬 ]

    価格:2,860円
    (2022/1/17 17:09時点)
    感想(7件)


    JavaプログラマGold SE 8 試験番号:1Z0-809 (オラクル認定資格教科書) [ 山本道子(プログラミング) ]

    価格:4,620円
    (2022/1/17 17:10時点)
    感想(0件)


    新人エンジニアのための データベースのしくみと運用がわかる本【電子書籍】[ 五十嵐貴之 ]

    価格:2,178円
    (2022/1/17 17:11時点)
    感想(0件)

    【Linux】Linuxの基礎的なディレクトリ


    Linuxに慣れていないとディレクトリの役割が良くわかりませんよね。


    ここではシンプルにLinuxディレクトリをまとめます。

    /usrディレクト


    名前を見るとユーザのディレクトリに見えるんだけど、実際は「各ユーザが共通して利用するプログラムおよびライブラリ等を置くディレクトリ」です。

    ユーザごとの個人的なファイルは/homeディレクトリ配下のホームディレクトリに置くことが一般的です。

    /usrディレクトリのサブディレクトリたち

    /usr/bin/

    ユーザが利用するコマンドのディレクト

    /usr/include/

    C言語で利用されるヘッダファイル

    /usr/lib/

    ライブラリのディレクト

    /usr/local/

    ローカルで管理するファイル群

    /usr/sbin/

    管理者専用のコマンドおよびプログラム

    /usr/share/

    アーキテクチャに依存しないファイル

    /usr/X11R6/

    X Window Systemに関するファイル

    /usr/games/

    ゲーム等

    /usr/src/

    ソースコード

    /etcディレクト

    各種設定ファイルが置かれているディレクト
    .confファイルがいっぱい置いてあるところ


    radiusとかいろんなミドルウェアを入れたとしても設定ファイルはetcディレクトリ配下のサブディレクトリとかで作られることが一般的。

    /rootディレクト

    rootユーザのディレクトリ。

    ユーザごとのディレクトリは/homeディレクトリですが、rootユーザのディレクトリは別。

    homeディレクトリに何か問題があった時のために専用のディレクトリに分かれています。

    /tmpディレクト

    一時的に使うファイルやディレクトリを置くためのディレクト


    temporaryの略です。

    このディレクトリの物は再起動すると消えます。

    /varディレクト

    ログファイルやキャッシュファイル等の一時的なデータを置いておくディレクトリ。

    よく/var/logディレクトリにログを溜めるようになっているので見る機会も多いと思います!

    /homeディレクト

    各ユーザごとのホームディレクトリを含むディレクトリ。

    ユーザを作るとホームディレクトリができます。


    さいごに

    最後まで読んでいただき、ありがとうございました。

    もし、記載している内容が間違えていれば遠慮なくコメントしてください!


    私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので💦

    関連記事・オススメ記事

    Webアプリのセッション管理について理解を深めよう

    今日はセッション管理についてちょっと業務中に調べて知識を入れたので、忘れないうちに備忘録を残しておこうと思います!

    セッションの利用

    Webアプリケーションは、HTTPを使ってクライアントとサーバでデータのやり取りを行います。


    HTTP自体には物理的にセッションを維持できない。


    なので、セッションを識別できるようにセッションIDという値をクライアントとサーバで連携して、セッションを維持している。


    クライアントとサーバの間でセッションIDの連携をする方法として、cookie(クッキー)かリクエストパラメータが使われる。


    複数の画面を移動するときに、データを持ち回りしたい場合はそのデータをセッションに格納することで、画面間で持ちまわることができる。



    セッションを利用することによるメリット・デメリット

    セッションを使うことによるメリットとデメリットは下記の通りです。

    • メリット
    1. 画面間でデータを持ちまわることができるので、複数の画面で1つの処理をするという場合にデータの持ち回りが簡単
    2. セッションに格納しておくことによって、データを取得する処理の回数を減らせる
    • デメリット
    1. 同じ処理をする画面を、複数のタブやブラウザで開いてしまうと、それぞれの操作がセッション上のデータを干渉するので整合性を保てない
    2. セッションがアプリケーションサーバのメモリとして管理されるので、セッションで格納するデータが増えるほどメモリの増加量も増える
    3. データをセッションに格納することによって、APサーバの拡張性(スケーラビリティ)を低下させることになりえる

    セッションを利用しないことによるメリット・デメリット

    逆にセッションを使わないことによるメリットとデメリットは下記の通りです。

    • メリット
    1. サーバ側でデータを持たないことになるので、画面を複数のブラウザやタブで開かれてもデータを干渉しない。
    2. サーバ側でデータを持たないので、メモリの使用量を抑えることができる。
    • デメリット
    1. サーバ側の処理で必要となるデータをいちいちリクエストパラメータで取得といけない。画面に表示してない項目も、hiddenに指定しておく必要がある。これによりJSPの実装が増えてしまう
    2. サーバ側の処理で必要となるデータを、すべてリクエストで取得するので送信する時に、ネットワークに流れるデータが増える
    3. 画面を表示するのに必要なデータを毎回取得する必要があり、データ取得の処理が増えてしまう。

    セッションに格納したオブジェクトの削除


    セッションで格納したオブジェクトは、ほっておくとメモリ枯渇の要因になるので削除してあげる必要があります。


    以下3つのケースでセッションのオブジェクトを削除しなければなりません。

    • 完了画面を表示する時のリクエス
    • 画面操作を途中で中止する時のリクエス
    • 入力画面を初期表示する時のリクエス

    それぞれ理由を解説していきます。

    完了画面を表示する時のリクエス

    完了画面を表示してしまうと、セッションに格納したオブジェクトにアクセスすることがないので、いらないオブジェクトを削除する必要がある。

    画面操作を途中で中止する時のリクエス

    画面操作を途中で中止する時も、セッションに格納したオブジェクトにアクセスすることはありません。


    不要なオブジェクトを削除する必要があります。

    入力画面を初期表示する時のリクエス

    登録画面などの入力できる画面での入力情報はセッションに格納されているフォームに残ります。


    再度画面を表示する時に、セッションに残っている情報から画面に表示されてしまいます。


    なので初期表示する時にはセッションを削除しておく必要があります。

    どうやって削除するのか?

    @SessionAttributesでセッションに格納したオブジェクトを削除したいという時は、SessionStatusクラスのsetCompleteというメソッドを
    Controllerの処理から呼び出します。

    setCompleteメソッドを実行すると@SessionAttributesアノテーションの属性値に指定しているオブジェクトがセッションから削除されます。

    ↓Springのアノテーションについてはこちらの記事でまとめています↓
    www.engineer-wataru.com

    【Java】Springフレームワークのアノテーションについて

    Springにおけるアノテーションの役割


    Javaフレームワークを使用してアプリを作る場合、データ・ファイルを連携するために設定情報を記述する必要があります。


    1つの方法として設定ファイルに記述するというのもありますが、設定ファイルに記述するとSpringの場合は設定ファイルが多くて分かりづらいのでこれ以上は増やしたくはないというのが一般的な考えのようです。


    Spinrgの場合は、ソースコード内のアノテーションを利用してデータ・ファイルを連携させる情報を記述させます。


    @Autowired

    インスタンス変数の前にこの@Autowiredアノテーションを付けておくと、@Componentアノテーションのついたクラスから該当するクラスをnewしてインスタンスを入れてくれる。

    ■TestAnnotationController.java

    @Controller
    public class TestAnnotationController {
       @Autowired
       private TestAnnotation testannotation;
    
    }
    


    ■TestAnnotation.java

    @Service
    public class TestAnnotation {
       ...略
    }
    


    @Componentアノテーションはそのまま使われることは基本ありません。


    @Controllerまたは@Serviceまたは@Repositoryが使われます。


    TestAnnotationController.javaのtestannotationインスタンスには、@Component(Controller,Service,Repository)アノテーションが付いているクラスの中からTestAnnotationクラスを探し出して、newしてインスタンスを入れてくれます。


    このような仕組みを依存性の注入といいます。
    ※DI(Dependency Injection)と略されます。


    シンプルにまとめれば、記述するだけで他のクラスを呼び出すことができる。


    このアノテーションを使わない場合は、毎回newをすることになる。

    @ModelAttribute

    @ModelAttributeアノテーションは2つの使い方があります。

    パラメータ内にアノテーションがある場合
    @RequestMapping(...)
    public xxx TestAnnotation(@ModelAttribute Testobject obj, xxxx) {
                                              //ここのアノテーション
       ...
    }
    

    のようなケースは「パラメータ内にアノテーションがある場合」になります。


    このケースはリクエストで送られてきたフォームからデータを受け取る時に利用されます。


    上記のコードだと、「obj変数にフォームの値を入れる」という挙動になります。
    ※GETリクエストのようにデータが送られてこない場合は、「new Testobject()」の空オブジェクトを生成します。

    メソッドのアノテーションの場合
    @ModelAttribute  //ここのアノテーション
    public xxx CreateTestObject() {
         return new TestObject                                    
    }
    

    のようなケースは、「メソッドのアノテーションの場合」になります。

    @Contolor内の@RequestMappingのメソッドの実行前にこのメソッドは呼び出されます。

    CreateTestObjectメソッドがTestObjectオブジェクトを返すため、@RequestMapping内のメソッドでこの処理を利用する
    というイメージです。

    ※生成されたオブジェクトをModelに自動的に付与されます。
    View側で使用することができます。

    @SessionAttributes

    セッションに格納する型を指定するアノテーション


    アノテーションのtypes属性にセッションに格納するオブジェクトの型を指定して利用する。

    @ModelAttributeアノテーションか、ModelのaddAttributeメソッドを使用して、Modelオブジェクトに追加されたオブジェクトの中から、この@SessionAttributesで指定した型と一致するものがセッションに格納される仕組み

    @Controller
    @RequestMapping("wizard")
    @SessionAttributes(types = { Watablog.class, Engineerblog.class  } )  // 型を指定する
    public xxx TestSpringController() {
        // ...                                  
    }
    

    この例だと、WatablogクラスとEngineerblogのオブジェクトがセッションに格納されるということ。

    Bean

    SpringのapplicationContext.xmlという設定ファイルで管理している、クラスを定義する「bean」をアノテーションを使う事で定義する。

    @Component

    SpinrgのDIコンテナにbeanとして登録したいクラスにアノテーションを付けます。
    @Controller、@Service、@Repositoryは@Componentを継承している。

    @Configuration

    XMLに記入する設定を、ソースコードに書きたい時にこのアノテーションを使います。
    @beanを付与したメソッドで構成されています。

    @Controller

    画面遷移、Service層(メインロジック)の呼び出しを行うアノテーションです。
    一般的に、Thymeleafでレンダリングしたものがレスポンスになる。

    このアノテーションを付けると、Springのコンポーネントとして認識されるので、ApplicationContextに登録されます。

    @RestController

    APIのコントローラに付与する。
    戻り値をStringにしたデータがレスポンスになります。

    @Respnsebody

    メソッドに付与すると戻りがそのまま返る

    @RequestMapping

    コントローラに付与するアノテーション
    リクエストURLに対してどのメソッドの処理を実行するかを定義する。

    @GetMapping

    GETリクエストを処理する@RequestMappingの簡略アノテーション

    @PostMapping

    Postリクエストを処理する@RequestMappingの簡略アノテーション

    @RequestParam

    URLに含まれるクエリパラメータや、メッセージボディに含まれるポストパラメータを受け取ることができる。

    @Data

    対象クラスにgetter/setterでアクセスすることを可能とする。
    equals()メソッドやtoString()メソッドが使えるようになる。

    @Service

    ビジネスロジックの処理を提供する。
    このアノテーションを付与するとSpringのコンポーネントとして認識される。ApplicationContextに登録されます。

    バリデーション系のアノテーション

    バリデーションは対象のクラスでアノテーションを付けることでパラメータチェックができます。
    最大値やNullなどの入力値のチェックが可能です。

    @Validated

    このアノテーションを付与すると自動的にバリデーションを行ってくれます。

    @AssertTrue

    Trueかどうかをチェックする

    @AssertFalse

    Trueかどうかをチェックする

    @Null

    オブジェクトの値がNULLであることをチェックする

    @NotNull

    オブジェクトの値がNULLではないことをチェックする
    ※フォーム未入力は空文字になってNULLではないので注意

    @NotBlank

    文字列に半角スペース、タブ文字などの空白文字以外が含まれているかチェックする

    @Max(value)

    valueで指定した最大値以下かどうかチェックする。

    指定する値はlong型になる。

    @Min(value)

    valueで指定した最小値以下かどうかチェックする。

    指定する値はlong型になる。

    @DecimalMax(value,inclusive)

    値が指定した最大値以下であるか、チェックする。

    第二引数のinclusiveをfalseとすると値が指定した最大値未満で判定される。

    @DecimalMin(value,inclusive)

    値が指定した最小値以下であるか、チェックする。

    第二引数のinclusiveをfalseとすると値が指定した最小値超過で判定される。

    @DateTimeFormat

    引数として渡された日付に対して形式通りかチェックする。

    @Size(最大値or最小値=value)

    文字数が指定の範囲かチェックする。

    さいごに

    最後まで読んでいただき、ありがとうございました。


    もし、記載している内容が間違えていれば遠慮なくコメントしてください!


    私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので💦

    【Linux】踏み台サーバ経由のリモートからscpでローカルに持ってくる方法

    こんにちは!wataruです。現場で作業をしていて、作業環境のLinuxサーバーのリモートサーバーからローカルのPCにファイルを持ってきたいということはありますよね。


    単純にリモートサーバにアクセスしてFTPツールやSCPツールなどで持ってくれば良いのですが、踏み台サーバが経由されていると話は別です。

    この記事でわかること

    踏み台経由のリモートからscpでファイルをローカルに持ってくる方法

    まずは踏み台サーバに対象ファイルを持ってくる必要がある

    必要なファイルがあるリモートサーバが踏み台サーバを経由している場合は、リモート→ローカルで直接ファイルを持ってくることはできません。


    一度、踏み台サーバにリモートからファイルを転送してくる必要があります!

    流れ

    1.リモートから踏み台サーバにファイルを転送 
    2.踏み台サーバからローカルに転送


    2は、FTPやSCPのツールを使うのが良いと思います。


    私はWinSCPでやりました。
    winscp.net


    ※最近はセキュリティの観点でWinSCPを禁止している現場もあると思います。

    テラタームを利用されていれば、【ファイル】タブのSSH SCPタブを選択→From,Toで転送元、転送先ディレクトリを指定→で踏み台にファイルを転送出来ます。


    私も最近WinSCPが禁止になってしまったので、踏み台サーバへの転送のやり方を変えました。


    テラタームならドラッグアンドドロップで転送ができます。

    リモートから踏み台へ転送するのには?

    リモートから踏み台サーバへ転送する場合は、SCPコマンドを使うのが良いです。


    SCPコマンドは通信はsshを使用して認証するデータ転送のコマンドです。


    例:リモートから踏み台サーバへファイルを転送する場合のコマンド

    scp [ユーザ名]@[ホスト名]:ディレクトリ/ファイル名 ./
    

    コマンド実行例

    scp dev-user@dev-1fst:/home/devuser/XXXX.tar.gz ./
    

    ※踏み台サーバーで実施

    scp dev-user@dev-1fst:/root/XXXX.tar.gz ./
    

    ※踏み台サーバーで実施

    踏み台に転送ができたらあとはツールなどでローカルに持ってくる

    踏み台に転送ができればあとはツールとかでローカルに持って来ましょう!

    踏み台サーバからリモートに転送する場合

    scp /XXXX/XXXX/ファイル名 [ユーザ名]@[ホスト名]:/ディレクトリ/ 
    

    コマンド記述例

    scp /home/xxxx.xxxx/scp_file.tar.gz dev-user@dev-1st:/tmp/
    ※踏み台の/home/xxxx.xxxx/scp_file.tar.gzをリモートの[dev-1st]サーバーの/tmp/ディレクトリに転送
    

    踏み台サーバからリモートにファイルを転送する場合は、ローカルに持ってくる時と逆です。


    踏み台サーバのファイル名を指定し転送するリモートに[ユーザ名]@[ホスト名]:/ディレクトリ/ のように指定してコマンドを叩きます。


    事前に踏み台サーバにファイルを配置しておきましょう。

    さいごに

    最後まで読んでいただき、ありがとうございました。


    最近は踏み台サーバ経由で開発環境にアクセスすることが多いと思いますので、この手順は知っておいて損は無いと思います!

    もし、記載している内容が間違えていれば遠慮なくコメントしてください!


    私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので💦

    【Java】意外と覚えれないString クラスのメソッド群をまとめてみました!

    JavaのStringは参照型のオブジェクトです。
    変数に入れたString型の文字を値と思ってしまいがちですが、オブジェクトでJavaは扱います。


    String型はStringというクラスのオブジェクトなのでいくつかメソッドが用意されています。
    ですが、String型のメソッドは全部を覚えるのは難しくて現場で実装している時にいつも調べてしまっています。


    そこで、私が覚えれないStringクラスのメソッド群をまとめてみました!
    ※この記事では、すべてのメソッドをまとめるわけではありません。


    StringクラスのメソッドはOrcle公式サイトでも公開されています。
    docs.oracle.com

    replase メソッド

    文字列置換を行うメソッドです。良く使いますねぇ・・・
    第一引数で置換対象文字列を指定し、第二引数で置換後文字列を指定する

    対象の文字列.replace(置換される文字列, 置換文字列)
    

    trim メソッド

    文字列から空白を取り除くメソッドです。これも良く使います。
    文字列の先頭と末尾の連続した空白と制御文字をすべて削除します。
    全角スペースは削除されません。

    対象の文字列.trim()
    

    substringメソッド

    文字列の一部を取り出すメソッドです。稀に使います。
    第一引数、第二引数で範囲を指定します。
    ※1文字目から3文字目まで・・・というイメージで

    対象の文字列.substring(int beginIndex, int endIndex)
    

    charAt メソッド

    String文字列から任意の文字をchar型で出力する。あんまり使いません
    char→Stringはvalueofメソッドを使う

    対象の文字列.charAt(int endIndex)
    

    concat メソッド

    引数で指定した文字列を対象文字列の末尾にくっつけるメソッド。これは良く使います。

    対象の文字列.concat(String "任意の文字列")
    

    endwith メソッド

    対象の文字列が引数で指定した文字列で終了しているかを判定しboolean値で返却する。あんまり使ったことありません(笑)

    対象の文字列.endswith(String "任意の文字") //戻り値はboolean
    

    使用例

        String str = "test";
        //trueが返る
        boolean flg = str.endsWith("t");
    	}
    

    結果

    true
    

    startWith メソッド

    対象の文字列が引数で指定した文字列で開始しているかを判定しboolean値で返却するメソッドです。

    対象の文字列.startwith(String "任意の文字") //戻り値はboolean
    

    使用例

        String str = "test";
        //trueが返る
        boolean flg = str.startWith("t");
    	}
    

    結果

    true
    

    equals メソッド

    同一値であるかを判定するメソッドです。
    ※ここでの同一とは同じ値であるかどうかです。


    objectクラスのequalsメソッドと少し違います。


    objectクラスのequalsメソッドは同一性、つまり同じオブジェクトであるかを判定するのに対し
    Stringクラスのequalsは同じ値であるかを判定します。


    これはJavaの難しいところですよねぇ・・・(笑)

    対象の文字列.equals(String "任意の文字")  //戻り値はboolean
    

    使用例

        String str = "test";
        Consumer<String> s = t -> System.out.print(t.equals("test"));
        s.accept(str);
    

    indexOf メソッド

    指定した文字列が対象文字列のどこに含まれているかを返すメソッド
    何も一致しない場合 -1を返す

    対象の文字列.indexOf(String "任意の文字") //戻り値はint
    

    使用例

        String str = "test";
        Consumer<String> s = t -> System.out.print(t.indexOf("t"));
        s.accept(str);
    

    結果

    0
    

    split メソッド

    指定した文字列を取り除くメソッド
    戻り値は配列型で返します。

    対象の文字列.split(String "任意の文字") //戻り値はString[]
    

    使用例

        String str = " texst";
        Consumer<String> s = t -> Stream.of(t.split("x")).forEach(h-> System.out.print(h));
        s.accept(str);
    

    結果

     test
    


    最後まで読んでいただきありがとうございました!
    他にもJava系の記事も書いていますので読んでいただけると嬉しいです。

    認証のプロトコルRADIUSについてまとめてみました!

    通信の認証に使われる、「RADIUS」についてまとめてみます!


    私は、このRADIUSについて初めて知ったので業務で資料を読んでもなかなか理解できませんでした。


    今回はこちらの本を参考にしています。


    RADIUSは情報が少なかったのでこの本はオススメです

    RADIUS ユーザ認証セキュリティプロトコル [ ジョナサン・ハッセル ]

    価格:3,520円
    (2021/7/1 17:58時点)
    感想(0件)


    RADIUSとは?


    RADIUSはネットワーク上の認証に使われるプロトコルのことです。
    プロトコルというのはお約束ってことですね。


    接続を要求してくるコンピュータは本当に本人なのか?何を許可するのか?という認証や承認をするのがRADIUSプロトコルの役割です。
    RADIUSはRemote Authentication Dial In User Serviceの略です。


    名前にAuthentication Dialとあるように、RADIUSは元々電話回線でダイアルアップ接続の使ってくるユーザに
    インターネット接続を実現するための認証プロトコルとして使われていたんです。

    RADIUSプロトコルはAAAモデルである

    RADIUSプロトコルはAAAモデルっていうフレームワークを元にしているんです。


    AAAは、Authentication(認証)、Authorization(承認)、Accounting(アカウンティング)の3つで構成されたフレームワークです。

    AAAにおける「認証」「承認」「アカウンティング」のそれぞれについて概念を押さえておきましょう。

    AAAにおける認証とは

    AAAにおける認証とは、相手の身分を確認する処理の事です。
    接続しようとしている相手は本当に本人なの?っていう確認です。
    一般的な認証といえば「ログインIDとパスワード」です。


    これはパスワードを知っているのであれば本人だよね。って認証することを意味しています。
    ですが、この方法ではパスワードを別の第三者に知られてしまうと認証としてはOKとしてしまうので役に立ちませんね・・・。

    最近では、信頼性を高めるために公開鍵基盤(PKI)っていうのを使います。

    AAAにおける承認とは

    AAAにおける承認とは、認証がOKとしたユーザに○○ならしていいよ!って許可する処理のことです。
    少し認証と承認ってややこしいですよね~😅

    AAAにおけるアカウンティングとは

    AAAにおけるアカウンティングっていうのはAAA処理の一連で利用者がサービスを利用した事実情報と内容を記録する処理のことです。

    RADIUSの構成について

    RADIUSの構成について解説していきます。

    RADIUSによる認証システムは「RADIUSサーバ」、「RADIUSクライアント」、「ユーザ」の3つの要素で構成されています。

    RADIUSクライアント

    RADIUSクライアントはアクセスを要求してくるユーザの認証を受け付けてRADIUSサーバにその情報を転送する役割を持ちます。


    RADIUSサーバからみると送信してくるものをクライアントと言うのでRADIUSサーバ送信元であればRADIUSクライアントになります。


    RADIUSサーバにこんな人が認証要求してきました~!合ってますか?RADIUSサーバさんって役割です。

    RADIUSサーバ

    RADIUSサーバは認証要求に対してアクセスを許可するのかを決定するのがRADIUSサーバです。

    RADIUSの利用方法


    RADIUSRADIUS認証サーバーと、RADIUS転送サーバーとして利用されます。
    それぞれの特徴を見てみましょう。

    RADIUS認証サーバーとは

    通称ホームサーバと呼ばれています。Home_Radiusなどと名前を付けられたりします。
    IDやパスワードなどの認証に利用するデータを持つサーバで認証のOK,NGを判定します。

    認証のために、DBにアクセスして検証したりします。

    RADIUS転送サーバー

    RADIUS転送サーバーはプロキシサーバーと呼ばれています。RADIUSパケットを条件にとって任意のRADIUSサーバーに転送する役目を持ちます。


    Proxy_Radisuなんて呼ばれ方もします。


    転送する先はプロキシサーバでもホームサーバで良いです。

    RADIUSを実現するソフトウェア


    RADIUSを実現するソフトウェアとしてメジャーなのがFree Radiusというソフトウェアがあります。


    これはRADIUSプロトコルを実現させるためのオープンソースソフトウェアです。

    Free Radiusはこちらにあります。
    freeradius.org

    さいごに

    最後まで読んでいただき、ありがとうございました。

    もし、記載している内容が間違えていれば遠慮なくコメントしてください!


    私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので💦

    【Java】Javaの配列の定義や間違いやすいポイントをまとめてみました!

    Javaで配列の使い方を私は結構忘れてしまうので、定義の仕方やポイントについてまとめておこうかと思います。


    ListやMapが便利ですから、配列って意外と使わなかったりしますよね・・・

    Javaにおける配列の定義の仕方

    f:id:koko55120:20210518225300j:plain

    Javaの場合は、最初に扱うデータ型を指定して配列を宣言します。
    Javaの配列の定義の仕方は以下の通りです。

    データ型[] 変数名 = new データ型[要素数];
    

    Javaでの配列の定義は、配列型の変数を定義して、newでオブジェクトで参照させる形になります。


    例えばint型の値を使う配列を宣言する場合は以下のように定義します。

    int[] numlist = new int[5]
    

    これは要素数5のint型の配列を宣言できました。


    厳密に言うと配列は宣言と作成で別れています。

    int[] numlist;
    

    これは配列の宣言です。

    numlist = new int[5];
    

    これは配列を作成しています。new データ型で配列を生成して宣言した配列(変数)が参照します。

    Javaの配列の注意ポイント

    f:id:koko55120:20210518231918j:plain

    配列の初期化と要素の指定は同時にできません

    配列を初期化するのと、要素を指定するのは同時の文ではできません。

    例えば、次の宣言はエラーになります。

    int array[] = new int[3] {10,20};
    
    }
    

    この例は、new int[3]で要素数3の配列を生成した後、{10,20}で初期化しているのはエラーになってしまいます。

    Javaの配列は参照型である

    Javaの配列で難しいポイントは、配列は参照型です。
    宣言した配列変数に対して配列のデータがそのまま入るわけではなく、実体の配列の場所を変数が持っているという仕組みになっています。


    これが、Javaの基本データ型と参照型の難しいところですよね。


    配列変数は参照先を持っているので他の配列変数にも同じ、配列のアドレスを渡すこともできます。

    int[] numlist = new int[3];
    
    numlist[0] = 100;
    numlist[1] = 111;
    numlist[2] = 222;
    
    int[] tmplist;
    tmplist = numlist;  //tmplistにnumlistが参照している配列のアドレスが渡される
    
    System.out.println(data[1]);  
    System.out.println(other[1]); 
    

    出力結果は同じ

    111
    111
    

    これはjavaの配列でわかりづらいポイントですよね。

    wataru55120.hatenablog.jp

    JavaプログラマBronze SE 7/8 オラクル認定資格試験学習書 (オラクル認定資格教科書) [ 山本道子(プログラミング) ]

    価格:3,520円
    (2021/5/25 21:27時点)
    感想(1件)



    JavaプログラマBronze SE 7/8 オラクル認定資格試験学習書 (オラクル認定資格教科書) [ 山本道子(プログラミング) ]

    価格:3,520円
    (2021/5/25 21:29時点)
    感想(1件)

    【Java】Javaの例外処理の特徴や制約についてまとめてみました!

    javaには例外処理という、例外が発生した時にどうするのかを事前に処理として定義することができます。


    今回は、例外処理を覚える上で重要なところをまとめてみます。

    例外クラスとは?

    f:id:koko55120:20220117170608j:plain
    例外クラスは、Javaの例外となる処理を実施するためのクラスです。


    例外クラスの親は全て「thorwable」クラスで、全ての例外クラスはthorwableクラスから継承されています。


    他にも例外の種類によって2種類のクラスに分かれています。

    ・メモリ不足などのエラーに関するクラスはErrorクラス
    ・アプリケーションで発生するエラーに関するクラスはException


    例外クラスの中にも制約があって、 例外が発生した際に例外に対する処理を必ず実施しなければならないクラス任意のクラスがあります。
    以下に制約をまとめました!

    スッキリわかるJava入門第3版 [ 中山清喬 ]

    価格:2,860円
    (2021/7/1 17:57時点)
    感想(6件)


    ・Exceptionクラスを継承したRuntaimeExceptionクラスおよびそのサブクラスは例外処理は任意
    ・ExceptionクラスおよびRuntaimeException以外のサブクラスの場合は例外処理は必ず記載する

    try-chtch-finaly句について

    例外処理を定義するには、try-chtch-finaly句を記入するのですが、これらには組み合わせによってルールがあるので注意してください。

    ■Try文の組み合わせルール

    ①try-catch-finalyの組み合わせ
    ②try-catchの組み合わせ
    ③try-finalyの組み合わせ

    try文だけで、記載するとコンパイルエラーになります。
    finalyブロックは、例外の発生有無に問わず必ず処理されます。

    catch文の中でreturn文がある場合の処理される順番

    catch文の中でreturn文があると処理される順番が決まっています。


    finalyブロックの処理が先に優先されて処理されます。


    処理としてはcatch→finallyと実行されるのですが、return文をする前にfinallyが実行されるということです。

    catchブロックとfinallyにreturnがある場合

    catchブロックとfinallyにreturnがある場合も変わってきます。


    finallyブロックの値で上書きされます。


    というのもcatch文の戻り値があり、finallyブロックで上書き処理をしても反映されるのはプリミティブ型だけでcatch文の戻りを上書きしません。
    参照型の場合は上書きされます。

    throwsとthrowについて

    throws句とthrow句は例外を意図的に投げることができます。

    throwsは、呼び出し元に例外を投げます。
    下記サンプルコードです。

    public static void main(String[] args) {
    
    Test obj = new Test();
            try{
                obj.method();
            }catch (ArrayIndexOutOfBoundException e){
                 System.out.println("例外発生");   
            }
    }
    
    public void method() throws ArrayIndexOutOfBoundsException{
    
           int a[] = {1,2,3}
    
           for(int i = 0; i < 4; i++){
                 System.out.println(a[i]);
           }
    }
    


    throwは、例外を意図的に発生させます。
    下記が、サンプルコードです。

    public void method() {
    
           int a[] = {1,2,3};
    
           for(int i = 0; i < 3; i++){
                 System.out.println(a[i]);
           }
           throw new RuntimeException("例外");
    
     }
    
    継承関係とオーバーライド時の注意

    throws句では、指定されたメソッドをオーバーライドした際のルールがありますので覚えておきましょう。

    ・サブクラスがスローする例外は、スーパークラスのメソッドと同様かそのサブクラスとする。
    ・サブクラスのスローする例外はRuntimeExcepitonおよびRuntimeExcepitonのサブクラスの例外はスーパークラスに関係なくスローできる。
    スーパークラスにスローがあってもサブクラスでスローしないことは可能。

    スーパークラスでArrayindexoutofboundsexceptionをthrowsし、サブクラスでIndexoutofboundsexceptionをthrowsするのはエラーになります。
    ※ArrayindexoutofboundsexceptionはIndexoutofboundsexceptionのサブクラスであるため

    try-catch文にも継承関係のルールがあります。

    ・catch文でcatchする例外はサブクラスから順番に書く。

    こちらがサンプルコードです。

          try{
               obj.method();
          }catch(Exception e) {
                System.out.println("例外発生");
          }
          catch (ArrayIndexOutOfBoundsException e){
                System.out.println("例外発生");
          }
     
    


    スーパークラスで例外をcatchすると到達不可能になるためです。

    さいごに

    最後まで読んでいただき、ありがとうございました。

    もし、記載している内容が間違えていれば遠慮なくコメントしてください!


    私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので


    【データベース】PL/SQLって何なの? PL/SQLの特徴やPL/SQLの書き方について解説

    Oracleのデータベースを使う現場で、PL/SQLという言語でパッチを作ることになり
    PL/SQLって何?」と思ったので、PL/SQLの特徴や書き方についてまとめようと思います!



    この記事でわかること

    PL/SQLとは?

    f:id:koko55120:20210518225300j:plain
    PL/SQLはデータベースに手続きする言語のSQLを拡張したOracleプログラミング言語です。
    PL/SQLのはPLは、procedural Languageの略です。

    どんなものか見てみましょう。

    DECLARE
      -- 宣言部   /*変数やカーソルを取得したりする*/
    BEGIN
      -- 実行部   /*UPDATEやINSERTを実行したり*/
    EXCEPTION
      -- 例外処理部  /*Javaでいうtry-catchみたいなところ*/
    END;
    /
    


    プログラミング言語なので、変数定義やIF文やFor文なども使用することができます。


    SQLを使うだけではなく、プログラミングで実装するような処理も一緒に、行うことができる言語というわけです。


    これは便利ですよね。普通にJavaプログラミングで書くとdatebaseにアクセスするインスタンス作って、SQL文やパラメータのデータをインスタンスに渡して〜みたいなことを実装しないといけないですもんね。

    PL/SQLってどんな特徴なの?

    PL/SQLの特徴は、SQL文を含めたプログラムを一括でDatabaseに送信することができます。


    例えばPL/SQLを使わない場合で、SQLでデータを複数件、SELECTして別のテーブルに取得したデータをINSERTする場合


    JavaでやるとJavaでデータベースにコネクションとSQLを渡して問い合わせ


    Javaで問い合わせ結果をパラメータに取得件数の数だけループして、INSERT文をデータベースに投げるみたいなことをコーディングすると思います。


    簡単にいうとPL/SQLを使わない場合、プログラムからデータベースに対して複数回呼び出しを行い


    データベースはSQL文を1行ずつ行います。
    アプリケーションとデータベースの間に通信が負担になりパフォーマンスが悪くなります。


    PL/SQLなら、SELECTして件数文ループしてINSERTまでの処理を一括でDatabaseに送信して、できるので
    データベースに送信する回数の観点から性能が向上するメリットがあります。

    PL/SQLの書き方

    f:id:koko55120:20210518225115j:plain
    PL/SQLは、ブロック構成で記載します。ブロックは3つの構成の中で書くことができます。
    宣言部、実行部、例外処理部の3つです。

    宣言部と例外処理部は省略することが可能です。

    実装の最後には"END;"を記載します。

    END;
    


    構成するブロックを1つずつ解説していきます。

    宣言部(DECLARE)

    宣言部は 、DECLARE と宣言したブロックで記載します。
    変数やカーソル、ユーザー定義例外の宣言をここでは行います。


    DECLAREは英語で”宣言する”です。 そのままですね。
    カーソルや変数を実際に宣言した例を下に書きます。

    DECLARE
      str VARCHAR(10);  //変数strをVARCHARで宣言
    
    CURSOR cur IS  //カーソルの宣言
       SELECT
       userid
      ,crateday
    
       FROM
       worktable
    
    BEGIN
     
    EXCEPTION
    
    END;
    /
    

    実行部(BEGIN)

    実行部は、SQL文によるデータの操作やFor文やIF文などの、実際に行う処理を記述するブロックです。」

    宣言部で宣言したカーソルを別テーブルにINSERTする例を書きます。

    DECLARE
      str VARCHAR(10);  
    
    CURSOR cur IS  
       SELECT
       userid
      ,crateday
    
       FROM
       worktable
    
    BEGIN
    for REC IN cur loop  //宣言部で宣言したカーソルの数だけINSERTを繰り返す
    
    INSERT INTO worktable2
       userid
      ,crateday
     
    VALUES
    (
      REC.userid
      REC.crateday
    )
    ;
    
    end loop;
    
    EXCEPTION
    
    END;
    /
    

    例外処理部

    PL/SQL は、 BEGIN と END 間でもし発生した例外は、EXCEPTIONブロックで定義した例外処理を行います。
    JavaでいうところのTry-catch文のようなものですね。

    DECLARE
      str VARCHAR(10);  
    
    CURSOR cur IS  
       SELECT
       userid
      ,crateday
    
       FROM
       worktable
    
    BEGIN
    for REC IN cur loop  
    
    INSERT INTO worktable2
       userid
      ,crateday
     
    VALUES
    (
      REC.userid
      REC.crateday
    )
    ;
    
    end loop;
    
    EXCEPTION
        WHEN OTHERS THEN
            ROLLBACK;
    END;
    /
    

    【java】java8で追加された日付を扱うAPIを紹介!(Date and Time API)

    従来のJavaでは日付/時刻を扱うためにDate/Calendar/DateFormt等のクラスを使用していました。

    ですが、新しいJava8で追加された「Date and TimeAPI」は今までの、日付/時間のクラスより使いやすいんです。

    また、ベンダー資格のJava silver試験の範囲にもなっていますので必ず押さえておきたいポイントでもあります。

     

    まずDate and TimeAPIの特徴を解説します

    f:id:koko55120:20210518231918j:plain

    いままで、一般的な開発者が扱うような日付/時間のユースケースJava言語で十分にサポートされていないのでJava開発者にとって長年の悩みの種だったと言われています。
    Date and TimeAPIはまさに、その悩みを改善するためにjava8から追加されたAPIと言えます。

     

    特徴① 日時のみを扱うクラス/日付のみを扱うクラスなどまたは日付+時刻を扱うクラスなど仕様用途で使い分けることもできる
    特徴② Immutable(不変)なオブジェクトである。


    既存インスタンスの値を変更する際は新しくインスタンスを作成する必要があります。

     

    日付を扱うLocalDate

    以下のような日付形式を扱うにはLocalDateクラスを使用する。

    2020-1-20
    

     

    現在の時刻を取得する。

    LocalDate date = LocalDate.now();
    

     

    now()メソッドは現在の時刻を返します。

     

    指定した年/月/日を渡しインスタンスを作成

    LocalDate date = LocalDate.of(2020,02,20);
    

    30年後の日付でオブジェクトを返してほしい場合

    LocalDate date = LocalDate.of(2020,02,20);
    
    //30年を足す
    System.out.print(date.plusYears(30));
    

    日時を扱うLocalTime

    以下のような日付形式を扱うにはLocalTimeクラスが使えます。

    15:57:04.142
    

    現在の時刻を取得する

    LocalTime time = LocalTime.of(15, 57,04,0);
    

    3時間後の日付がほしいとき

    LocalTime time = LocalTime.of(15, 57,04,0);
    
    //Hoursは時
    System.out.print(time.plusHours(3));
    

    日付+時間を扱うLocalDateTime

    LocalDateTimeは、以下のような日付時刻を扱います。

    2020-02-28T16:01:12.659
    


    現在の時刻と日付を取得する

    LocalDateTime datetime = LocalDateTime.now();