連載 / IPv6 の実装ー⑩ 図 1 SPD 工ントリのオ 554 555 556 557 if ()o = = NULL) sp = ipsec6-getp01icybysock(m, sp = ipsec6-getp01icybyaddr(m, IPSEC_DIR_OUTBOUND , IPSEC_DIR_OUTBOUND , 0 , &error) ; SO, ; と、同時にカーネル内でソケットに対応する PCB (Pro- tocol Control Block) が作られます。各 PCB には SPD 工ントリをオ褓内するための領域か確保されており、ソケッ トを使って通信するときは、 4 月号て解説した SPD 工ン トリのリストに加え、 PCB にオ内されている SPD 工ン トリも参照されます。 ューサー空間のフログラムが通信する際、通常はソケッ トを利用します。近ド爾架索 (Neighbor Discovery) の入 出力のように、カーネル内でバケットか生成される場合 や、ルータとして動作しているノードでバケットか沖幻医さ れる場合はソケットは作られません。 554 ~ 557 行目 ( 図 1 ) では、出力しようとしているパ ケットに対応する SPD 工ントリを検索します。バケット に対応するソケットがなければ、 555 行目で ipsec6-get- policybyaddr() を呼び出し、バケットに言当求されている アドレス情報などから対応する SPD 工ントリを検索し ます。ソケットが存在する場合は ipsec6-getpolicyby- sock() を呼び出し、 PCB に格納されている SPD ェン トリも検索対象とします。これらの関数についてはあとで が IPSEC-POLICY-DISCARD であれは、 トは破棄しなけれはなりません。 575 case IPSEC_POLICY_BYPASS : 576 case IPSEC_POLICY_NONE : このノヾケッ 578 579 needipsec break ・ IPSEC-POLICY-BYPASS か IPSEC-POLICY- NONE カ甘旨定されている場合、このバケットは IP セキュ リティの処理をおこなわすに出力することができます。変 数 needipsec を 0 に設疋すると、以後の ip6-output() の処理で、バケットに対する IP セキュリティ関連の処理 カ躾行されなくなります。 case IPSEC_POLICY_IPSEC : 581 582 584 585 586 587 588 if (sp->req = = NULL) { error = key—spdacquire goto freehdrs ; needipsec break; 解説します。 if (sp 559 561 562 } = NULL ) { goto freehdrs ; SPD ェントリが存在しなければバケットを破棄しま す。認証や暗号化の処理をおこなう必要がない場合でも、 IP セキュリティ処理カ坏要であることが明示されている SPD ェントリカ亟されます。 567 ~ 593 行目で、必要に応して SAD (Security As- sociation Database : セキュリティ・アソシェーション・ データベース ) 工ントリを礑呆します。 567 switch (sp->policy) { 568 case IPSEC POLICY_DISCARD : 5 73 goto freehdrs ; SPD ェントリに指定されているセキュリティ・ポリシー 78 IPSEC-POLICY-IPSEC カ甘旨定されている場合は、 IP セキュリティの処理が必要です。 IP セキュリティ処 理に必要な情報は SAD 工ントリに↑褓内されています。ま す、 582 行目で対応する SAD 工ントリが SPD 工ントリ にすでに割り当てられているかを確認し、割り当てられて いなけれは 584 行目の key-spdacquire() で SAD 工ン トリを割り当てます。そして、以後の ip6-output() の処 理で IP セキュリティ処理が実行されるように、 587 行目 で変数 needipsec を 1 に設定します。 590 case IPSEC_POLICY_ENTRUST: 591 default : 593 } IPSEC-POLICY-ENTRUST は、 IP セキュリティ の処理方法について特定の挙動を示す値ではありません。 これは、 PCB 内部に作成された SPD ェントリに設定さ れる匆月値てす。 UNIX MAGAZINE 2003.6
821 822 823 824 連載 / IPv6 の実装ーの bzero(&spidx, sizeof (spidx) ) ; struct secpolicyindex spidx; ipsec6-getpolicybysock() 関数 もう 1 つの SPD 工ントリ検索関数である ipsec6_get- policybysock() は、ソケット経由でバケットか生成され spidx は secpolicyindex 構造イ本の変数です。 SPD ェ ントリは 833 行目の key-allocsp() 関数て検索されます。 その際の検索キーとして spidx を利用します。 ipsec—setspidx—mbuf (&spidx, 827 *error た場合に利用されます。 652 struct secpolicy * 653 ipsec6—getp01icybysock(), dir, SO, 654 655 656 657 658 { struct mbuf *m ; u_int dir; struct socket *so; 828 AF_INET6, m, (flag & IP-FORWARDING) ? 0 ipsec-setspidx-mbuf() は、 mbuf にオ内されている バケットの情報から spidx に必要な情報をコピーする関 一日立層プロトコル番号 始点 / 終点アドレス 数です。コピーされる情報は、 ・ポート番号 です。 830 831 833 834 } if sp (*error ! = 0 ) return NULL ; key—allocsp(&spidx, dir) ; ipsec-setspidx-mbuf() で正常に spidx のイ直か疋で きたら、 spidx をキーにして key-allocsp() を呼び出しま す。 key-allocsp() は、 spidx に設定された情報と dir で 指定されたバケットの流れる方向から、適切な SPD ェン トリのポインタを返す関数です。 837 if ()p ! = NULL) { ipsec6-getpolicybysock() は 4 つの引数をもちます。 m と so は SPD 工ントリの検索キーとなるバケットとソ ケットです。 dir はバケットの流れる方向で、 ipsec6-get- policybyaddr() の場合と同様、 INBOUND か OUT- BOUND のいすれかの値をとります。 error は ipsec6- getpolicybysock() で発生したエラーを通知するために 利用されます。 673 pcbsp = sot0in6pcb(so)->in6p-sp; ソケットを使って通信する場合、各ソケットに対応す る SPD 工ントリは PCB 内部に作られます。 pcbsp に、 currsp ; ー 0 ; dir) ; checkpcbcache (m , pcbsp, PCB に設定されている SPD 工ントリへのポインタを設 定します ( 673 行目 ) 。 682 683 684 685 686 = IPSec if (currsp) { 841 842 return SP , 843 } key-allocsp() で適合する SPD 工ントリがみつかった ら、その SPD 工ントリのポインタを返します。 846 847 848 849 } ip6-def—p01icy->refcnt + + ; return ip6-def—p01icy; 適切な SPD 工ントリか存在しない場合は、システム・ デフォルトとして設定されているポリシーを含む SPD ェ ントリ (ip6-def-policy) を返します。 88 ipsec-checkpcbcache() は、 PCB に設定されている SPD 工ントリカ陏効かどうかを確認します。たとえば、 UDP を使ってコネクションレスで通信する場合、バケ ット送信のたびに終点アドレスか変化する可能生がありま す。このとき、 PCB に一尉寺している SPD ェントリを出 力するバケットに対応する SPD ェントリに更新しなけ ればなりません。 ipsec-checkpcbcache() を呼び出すと、 必要に応して適切な SPD 工ントリを再検索します。な お、 TCP のようなコネクション指向プロトコルを利用す るときには、終点アドレスが変化することはありません。 この場合、一一度検索した SPD 工ントリか断売して利用さ 再検索処理は実行されません。 UNIX MAGAZINE 2003.6
0 旧 v6 の実装 島慶ー 旧セキュリティの出力処理 最近、ミーティングの機会か増えました。遠方でのミ ーティングも多く、時間とお金を有効に活用するために H. 323 による遠隔会議システムを導入してみました。 れまでも電話による〕動鬲ミーティングは利用していました が、やはり映像か加わってからは話の流れを見失うことが 少なくなったように思います。相手と対面しての会話は声 だけで成り立っているわけではなく、無意識のうちに目や 顔、手の動きなども使って自分の考えをより町寉に伝えよ うとします。電話会議の場合、その部分の情幸肋ゞ欠落して しまうのです。 ただし、 H. 323 システムを設定していると、お決まりの 間題に直面します。社内の他の H. 323 システムとの通信 は当然として、社外の H. 323 システムとも通信したいの ですが、 NAT 箱のグローバル IP アドレスを設定する必 要があったり、プロトコルて利用されるポートを開放しな ければならなかったりと、使い始めるまでになにかと手間 がかかります。あまり嬉しくないことですが、ネットワー クを気軽に活用してほしいアプリケーション開発者、貴重 な IPv4 アドレスを簡単には配付できない ISP 、その狭間 で設定に苦しむ一殳ューザーの気持ちを共有できたような 気がしました。 今回参照するファイル 今回は、 IP セキュリティの出力処理に関連する以下の ファイルを参照します。 ・ kame/sys/netinet6/ip6-output. c ( 改言丁番号 1.362 ) ・ kame/sys/netinet6/ipsec. h ( 改訂番号 1.64 ) ・ kame/sys/netinet6/ipsec. c ( 改訂番号 1.181 ) UNIX MAGAZINE 2003.6 IP セキュリティ適用時のバケットの出力 KAME では、 IP セキュリティ・バケットの処理が出力 フィルタとして実装されています。すなわち、 IP バケッ トの出力の過程で IP セキュリティ処理が必喫かどうかを 判断し、必要であれは出力処理の途中でバケットの認証や 暗号化をおこないます。以前 ip6-output() 関数を角犇見し たときは、 IP セキュリティ里処理部はとりあげません でした。ますはこの省略した部分から解説していきます。 以後、とくに明記しないかぎりコードは ip6-output. c か らの抜粋です。 セキュリティ・ポリシーの検索 バケットに IP セキュリティを適用する場合、バケッ トに対応する SPD (Security Policy Database : セキュ リティ・ポリシー・データベース ) 工ントリの情報か必要 です。 ip6-output. c の 323 ~ 593 行目は SPD 工ントリ の本処理て一す - 。なお、 323 ~ 593 行目には IP セキュリ ティとは関係のない処理も含まれていますが、その部分は すでに斉みなのて割愛します。 323 324 325 328 329 int needipsectun = 0 ; struct socket *so; struct secpolicy *SP = NULL; ipsec-getsocket(m) ; SO (void) ipsec-setsocket(), NULL) ; 323 ~ 329 行目では、 IP セキュリティ処理に必要な変 数をネ月化します。 ipsec-getsocket() は、 ip6-output() で出力しようとしているバケット m に対応するソケット を取得する関数です。プログラムがソケットを作成する 77
連載 / IPv6 の実装ー⑩ 図 6 内側の IP ヘッタ・以降 ~ 里 3363 3364 3369 3370 3376 3377 3381 3382 3384 3388 3391 3393 3394 3395 3405 3406 3407 3408 3409 3401 switch (isr—>saidx. proto) { case IPPROTO_ESP : error = esp6—output (state—>m , &ip6—>ip6—nxt , state—>m—>m_next , isr) , break; IPPROTO_AH : error = ah6—output (state—>m , &ip6—>ip6—nxt , state—>m—>m_next, isr) ; break ; default : if m—freem(state—>m) ; error = EINVAL ; break ; error = EINVAL; goto bad ; sizeof (struct ip6—hdr) ; (plen > IPV6—MAXPACKET) { ip6 = mtod(state—>m, struct ip6—hdr * ) ; ip6—>ip6—p1en = htons (plen) ; 3 , 400 ~ 3 , 409 行目はノヾケットのペイロード長の更辛万で す。認証ヘッダや暗号化へッダを追加したことによって 変化したペイロード長を修正します。 トに対しておこないます。 IP セキュリティ処理が必要か は SPD 工ントリに言当されているので、バケットを処理 する前に適切な SPD 工ントリを検索しなけれはなりませ ん。出力バケットに対応する SPD 工ントリの検索は、 ip- sec6-getpolicybyaddr() と ipsec6-getpolicybysock() で実装されています。 ipsec6-getpolicybyaddr() 関数 ipsec6-getpolicybyaddr() は、バケット自身に含まれ ている情報をもとに、対応する SPD ェントリを検索し ます。 3502 3504 3506 3507 3508 3509 3510 bad : return 0 ; m—freem(state—>m) ; state—>m = NULL; return error ; 807 808 809 810 811 812 813 struct secpolicy * ipsec6-getp01icybyaddr (m , dir , int *error ; int flag; u_int dir; struct mbuf *m; flag, 正常にトンネルバケットが作成できれは 0 を返し、処 理の過程でエラーがをしたらバケットを解放してエラー コードを返します。 SPD 工ントリの検索 ip6-output() では、バケットに IP セキュリティ処理 を適用する必要があるかどうかの市忍を、すべてのバケッ UNIX MAG AZINE 2003.6 この関数は 4 つの引数をもちます。 rn は SPD ェント リ検索のキーとなるバケット、 dir はバケットカ毓れる方 向で、とりうる値は INBOUND ( 入力されたバケット ) 、 OUTBOUND ( 出力されるバケット ) の 2 つです。 flag は、 ip6-output() の呼出し時に指定されたフラグです。 error は、 ipsec6-getpolicybyaddr() で発生したエラー を通知するために利用されます。 87
連載 / IPv6 の実装ー⑩ 図 7 IPSEC-POLICY-ENTRUST が諚されている場合のタ里 713 case IPSEC_POLICY_ENTRUST: 715 716 721 722 723 724 if (ipsec—setspidx—mbuf (&spidx, AF—INET6, m, 1 ) (kernsp = key-allocsp(&spidx, dir) ) ! = NULL) { ipsec-fillpcbcache (pcbsp, m, kernsp, dir) ; return kernsp ; 図 8 バケットに適合する SPD 工ントリの 749 750 755 756 757 758 689 690 691 692 693 694 695 696 697 698 if (ipsec—setspidx—mbuf (&spidx, AF—lNET6, m, 1 ) (kernsp = key—allocsp(&spidx, dir)) ! = NULL) { *error = 0 ; ipsec—fillpcbcache(pcbsp, m, kernsp, dir) ; return kernsp , switch (dir) { case IPSEC_DIR currsp break; case IPSEC_DIR_OUTBOUND : currsp break; default : INBOUND : pcbsp—>sp— pcbsp->sp—out ; 1n ; panic("ipsec6—getp01icybysock: illegal direction. " ) ; IP セキュリティの仕組みでは、バケット入力時とバケッ ト出力時で異なるポリシーを設定することかできます。パ ケットの流れる方向に従って適切な SPD 工ントリお尺 します。 705 ~ 787 行目で適切な SPD 工ントリを j 尺し、呼出 し側にポインタを返します。 SPD ェント弱尺の規則は、 通信しているプロセスか罸在プロセスかどうかで異なりま す。前半の 705 ~ 745 行目は特権プロセスの場合の処理 705 if (pcbsp—>priv) { 権フ。ロセスのみカ甘旨定できます。 IPSEC-POLICY-BY- PASS は、鍵交換プロトコルを実装したプロセスが鍵交 換に必要なバケットを送信する場合などに利用されます。 こでは 682 行目の ipsec-checkpcbcache() で返され た SPD 工ントリを返します。ただし、ポリシーが BY- PASS に設定されているため、実際には IP セキュリティ 処理が実行されることはありません。 713 ~ 730 行目はポリシーとして IPSEC-POLICY- ENTRUST が指定されている場合です。このポリシー は、ソケットを作成して通信する際に匆琪月値として PCB の SPD 工ントリに設定される値です。 IPSEC-POLI- CY-ENTRUST カ甘旨定されていたら、 ipsec6-getpoli- cybyaddr() と同様に、 ipsec-setspidx-mbuf() と key- allocsp() を使ってバケットに含まれる↑帯長から SPD 工 ントリを検索します ( 図 7 ) 。 727 728 729 730 ip6—def—p01icy—>refcnt 十十 ; = 0 ; ipsec-fillpcbcache(pcbsp, m, ip6—def—p01icy, dir) ; return ip6—def—p01icy ; 706 707 708 709 710 711 switch (currsp->policy) { case IPSEC_POLICY_BYPASS : currsp—>refcnt 十十 ; *error = 0 ; ipsec—fillpcbcache(pcbsp, m, currsp, dir) ; return currsp ; key-allocsp() で適切な SPD 工ントリがみつからなけ れは、 ipsec6-getpolicybyaddr() と同様にシステム・デ 732 case IPSEC_POLICY_IPSEC : フォルトの SPD 工ントリを返します。 705 ~ 711 行目はポリシーとして IPSEC-POLICY- BYPASS カ甘旨定されている場合です。このポリシーは特 UNIX MAGAZINE 2003.6 733 734 735 currsp—>refcnt 十十 ; = 0 ; ipsec—fillpcbcache (pcbsp , m , 89
連載 / IPv6 の実装ーの 図 9 ポリシー直に従って適切な SPD 工ントリを返す里 761 762 766 767 769 770 771 772 773 775 776 777 778 779 781 785 786 787 788 789 736 switch (currsp—>policy) { case case IPSEC_POLICY_BYPASS : *error = EINVAL; re turn NULL ; IPSEC_POLICY_ENTRUST : ip6—def—p01icy—>refcnt + + ; *error = 0 ; ipsec—fillpcbcache (pcbsp , return ip6—def—p01icy ; IPSEC_POLICY_IPSEC : currsp—>refcnt 十十・ ipsec-fillpcbcache (pcbsp , return currsp ; m , ip6—def—p01icy, dir) ; currsp , dir) ; default : currsp , dir) ; / * NOTREACHED * / て e turn NULL ; *error = EINVAL ; return currsp , 732 ~ 736 行目は、ソケットを作成したプロセスか明示 checkpcbcache() で検索された SPD 工ントリカ亟され 的にポリシーを指定している場合です。この場合は ipsec- ます。 738 741 742 743 744 745 } default : *error = EINVAL ; return NULL ; / * NOTREACHED * / 未定義のポリシーか指定してある場合はエラーとなり、 NULL カ亟されます。 749 ~ 787 行目は罸在プロセスではない場合の SPD 工 ント弱尺処理です。 749 ~ 758 行目 ( 図 8 ) で、 ipsec-setspidx-mbuf() と key-allocsp() を使ってバケットに適合する SPD 工ン トリを検索します。この点で SPD 工ントリがみつかれ ば、そのエントリを返します。 図 9 の 761 ~ 787 行目で、ポリシーの値に従って適切 90 な SPD 工ントリを返します。罸雀プロセスとの違いは、 IPSEC-POLICY-BYPASS カ甘旨定されているときに工 UNIX MAGAZINE 2003.6 ( しま・けいいち IIJ) 次回も IP セキュリティの出力処理の角見を続けます。 ☆ ラーとなる点です。
合、注意すべき点が 1 つあります。経路制御ヘッダには、 バケット転送の過程で変化する残り中継ノード数 (ip6r- segleft) フィールドがあります。 IP セキュリティの計算 と検算では、このフィールドを 0 にすることか規定され ています。 743 ~ 747 行目では、バケットに含まれる経路 制御ヘッダの残り中継ノード数を segleft.org に保存し、 代わりに 0 を設定しています。 segleft.org の値は IP セ キュリティ処理の終了後に復元されます。 なお、この操作が必になるのは認証ヘッダカ俐用され る場合のみです。なぜなら、暗号化へッダの処理では経路 制御ヘッダの情報をまったく参照しないからです。しか しながら、 KAME ではとくに認証ヘッダの場合に限定す ることなく、上記の処理をおこなっています。暗号化へッ ダを利用している場合でも、 segleft.org の保存と復元は 処理結果に景しないので、手間をかけて認証ヘッダと暗 号化へッダを区別するより、どちらについても同しコード を実行するはうか効率的だからです。 756 bzero(&state, sizeof (state) ) ; 757 state . m = m; バケットに変更を加える前に、処理状態を言当求する ip- sec-output-state 構造体を初期化します。 1psec6—output—trans(&state, 758 error 連載 / IPv6 の実装ーの ipsec6-output-trans() のなかで書き換えられる変数で、 あとに続く ip6-output() の処理でトンネルモード処理が 必要な場合に真になります。 ipsec6-output-trans() につ いては彳します。 760 m = state . m; IP セキュリティの処理か完了したバケットを state. m 761 if ( e てて or ) { から取り出します。 763 764 765 766 767 768 769 770 m = NULL ; switch (error) { case EHOSTUNREACH : case ENETUNREACH : case EMSGSIZE : case ENOBUFS : case ENOMEM : break ; トランスポート・モードの処理中にエラーが発生したと きは、バケットを破棄します。 771 776 777 778 779 774 default: goto bad ; case ENOENT : error break ; 0 ; 759 nexthdrp, mprev, sp, flags, &needipsectun) ; トランスポート・モードの処理を実行するのは、 758 ~ 759 行目で平び出している ipsec6-output-trans() です。 処理対象となるバケットは state に設定されています。 nexthdrp は、上位層プロトコルの直前に配置されてい る拡張ヘッダの次へッタイ直フィールドを指すポインタで す。 ipsec6-output-trans() で IP セキュリティの処理 が実行されると、新たに認証ヘッダや暗号化へッダか挿 入されます。 nexthdrp は、認証ヘッダや暗号化へッダ のプロトコル番号を直前の拡張ヘッダの次へッダ値フィ ールドに設定するために利用されます。 mprev は、認証 ヘッダや暗号化へッダか配置される直前の拡張ヘッダを 含む mbuf を指すように設定されています。 sp は前述の SPD 工ントリ検索の結果適合した SPD 工ントリです。 flags は ip6-output() の引数として渡されるフラグです が、現在のところ利用されていません。 needipsectun は 80 工ラー値として ENOENT カ芍区されるのは SAD 工ン トリか存在しない場合です。このエラーは、鍵交換プロト コルによって SAD 工ントリを作成している途中に発生し ます。この場合、 error を 0 に成正してバケットを破棄し ます。すると、上位層プロトコルからは送信したバケット がネットワーク上のどこかで破棄されたようにみえます。 破棄されたバケットの再送は上位層の責任です。 780 781 791 783 784 if (exthdrs . ip6e-rthdr) { rh—>ip6r-seg1eft segleft.org/ 792 skip—ipsec2 : トランスポート・モードの処理カ院了したので、 781 ~ 784 行目で経路制御ヘッダの残り中継ノード数を復元し ます。 UNIX MAGAZINE 2003.6
特集 表 2 定斉みのサービスグループ IP ノ、ケット不重別 IP ノ、ケット不重別 IP ノ、ケット不亜別 IP / ヾケット不亜別 SunScreen 3.2 rsh 、 サービスグループ daytime d iscard HA 1 mosa1C netbios nfs nfs readonly nlS time tsolpeerinfo common 含まれるサービス nis 、 pmap-nis 、 pmap-udp 、 pmap-tcp 、 rpc-tpc 、 rpc-udp 、 realaudio 、 ftp 、 tcp 、 tcpalls dns 、 udp-datagram 、 udp 、 udpall 、 ping 、 icmp 、 ipmobile tcp all 、 udp all 、 syslog 、 dns 、 rpc all 、 nfs prog 、 icmp all 、 rip 、 ftp 、 rsh 、 real audio 、 pmap udp alk pmap tcp all 、 rpc tcp all 、 nis 、 archie 、 traceroute 、 ping daytime 、 daytime-udp discard 、 discard-udp ech0 、 echo-udp HA heartbeat 、 HA administration esp 、 ah 、 isakmp www 、 ssl 、 gopher 、 ftp 、 archie netbios narne 、 netbios datagram 、 netbios session mountd 、 nfs prog 、 rquota 、 nlm 、 status 、 nfs acl mountd 、 nfs readonly prog 、 rquota 、 nlm 、 status 、 ypserv 、 yppasswd 、 ypupdate 、 ypbind time 、 time-udp tsolpeerinfo-tcp 、 tsolpeerinfo-udp 表 3 てきるステートエンジン ( 各項目末尾の [ ] 内はデフォルト nfs acl / ヾラメータ ステート 工ンジン名 dns ether ftp lcmp IP ipfwd ipmobile iptunnel 概要 指定されたバケット種別に属する IP バケッ 続のバケットは双方向に通す 最初の IP バケットを順方向にだけ通し、後 順方向にだけ IP バケットを通す か iptunnel 、 ipmobile をイ月 換性のために用意されており、現在は ipfwd 順方向にだけ IP バケットを通す。ード位カ : 順方向にだけ ICMP バケットを通す ドル嗤呂」でセッションを終了 データ・コネクションともに 600 秒のアイ フォルトでは、コントロール・コネクション、 ードと PASV モードの両方で解釈する。デ コネクションに含まれるポート番号を通常モ FTP サーヒ、スの定義で利用。コントロール・ ロトコルなどのためのルールを定義する際に の Type フィールドなどを識別し、 IPX プ ステルスモードにおいて Ethernet フレーム が一致しているかを石忍 クエリーに対する応答バケットを識別し、 ID DNS サーピスの UDP 部分に使用。 DNS トを双方向に通す 識別情報 ホート番号 [ 53 ] ポート番号 [ 21 ] ICMP 種別 UNIX MAGAZINE 2003.6 1 ) 応答がタイムアウトするまでの秒数 [ 60 ] 2 ) 1 つの要求に対して期待される応答の数 1 ) コントロール・コネクションがタイムアウ トするまでの秒数 [ 600 ] 2 ) データ・コネクションがタイムアウトする までの秒数 [ 600 ] 3 ) フラグ値 : 1 の場合はコントロール・コネ クションより 1 小さいポート番号からのもの を除き、 PASV モードのデータ・コネクショ ンを禁止回 1 ) トラフィック・情報をキャッシュに残す秒 数 [ 60 ] 2 ) 定数 1 1 ) トラフィック情報をキャッシュに残す秒 数 [ 36 叫 2 ) 定数 0 1 ) トラフィック情報をキャッシュに残す秒 数 [ 60 ] 2 ) 定数 0 43
連載 / IPv6 の実装ーの exthdrs . ip6e—ip6 = m ; 1088 } 1087 3037 ipsec6—output—trans (state , nexthdrp , 3036 int からの抜粋です。 trans() で作成されます。以後参照するコードは ipsec ・ c トランスポートモード・バケットは ipsec6-output- トランスポートモード・バケットのイ乍成 は以 - ヒです。 ip6-output() 内での IP セキュリティに関係する処理 ip6 に設定し、トンネルモードの処理を終了します。 最後に、新しく作成されたトンネルバケットを ip6e- の変数 sp ->req に含まれます。変数 isr 経由ですべての ipsecrequest 構造体を石忍します。 3069 if (isr—>saidx . mode IPSEC_MODE_TUNNEL) { 3071 3072 } break ; 3038 3039 3040 3041 3042 3043 3044 { mprev , sp , flags , tun) struct ipsec—output—state *state; u—char *nexthdrp ; struct mbuf *mprev ; struct secpolicy *sp; int flags ; int *tun; ipsecrequest 構造体の saidx 変数 (isr —>saidx) に は、 SPD ェントリに対応する SAD 工ントリを検索する 際の条件か第当求されています。 ipsecrequest 構造体のリ ストは、ますトランスポート・モード用の SAD 工ントリ か並び、続いてトンネルモード用の SAD 工ントリが列挙 される配置となっています。もし、現在チェック中の i secrequest 構造体がトンネルモード用であればループを 抜けます。 3074 error = 1psec6_checksa(isr, state, 0 ) ; ipsec6-checksa() は、 isr でカされる ipsecrequest 構 造体に含まれている SAD 工ントリの情報が、 state に含 まれている処理対象となるバケットに適合するかどうかを 石忍します。 3075 if (error = EIO) ipsec6-output-trans() は引数を 6 っとります。 state は処理対象となるバケットへのホインタが含まれた ipsec -out put -st at e 構造体です。 next hdrp は、認証ヘッダ や暙号化へッダの直前に配置されるヘッダの次へッダ値 フィーノレドへのポインタです。 mprev は、言正へッダや 暗号化へッダの直前に配置されるヘッダをオ褓内した mbuf へのポインタです。 sp は ip6-output() 内で ipsec6-get- policybyaddr() や ipsec6-getpolicybysock() で索し た SPD ェントリへのポインタです。 flags は ip6-out- put() の引数として渡されるフラグですが、現在のところ 利用されていません。 tun は、トンネルモードの処理が必 要かどうかを ip6-output() に返すための変数です。トン ネルモードの処理が必要になる場合は tun が 1 に設定さ づけられている各 SAD 工ントリについて、 IP セキュリ 3 , 068 ~ 3 , 165 行目のループで、 isr—>next) { sp—>req; isr; 3068 for (isr 3067 *tun = 0 ; れます。 SPD 工ントリに関連 lsr トリにリストとしてイ尉寺されている ipsecrequest 構造体 ティの処理を実行します。 SAD 工ントリは、 SPD 工ン 82 3076 got0 bad; ipsec6-checksa() でエラーが発生した場合は、処理中 のバケットを破棄します。 = ENOENT) { 3077 if (error isr に含まれているはすの SAD 工ントリがない場合、 ipsec6-checksa() のエラーコードとして ENOENT が 返されます。このエラーは、鍵交換フロトコルを用いて動 的に SAD 工ントリを作成している場合に発生します。 ENOENT が返された場合は、バケットか破棄された ことを通知するために自分自身に ICMP ェラーを発行し ます ( 図 2 ) 。工ラーを通知することで、バケットの紛失 を - 早期に検出することができるため、素早い再送が実現で きます。 IP セキュリティでは、ポリシーの適用レベルとして 、、可能なかぎり IP セキュリティを適用 (IPSEC-LEV- EL-USE)" と、、かならす IP セキュリティを適用 (IP- SEC-LEVEL-REQUIRE)" を指定できます。 IPSEC- LEVEL-USE カ甘旨定されたときに SAD 工ントリが存在 しなければ、 IP セキュリティ処理をおこなわすにそのま UNIX MAGAZINE 2003.6
特集、 SunScreen 3.2 図 17 言田なログの言泉をキ諚 root@exp$ ssadm edit lnitial Loaded common objects from Registry version 6 Loaded policy from lnitial version 6 edit> add interface SCREEN exp dmfel ROUTING exp-dmfel LOG SUMMARY edit> 1ist interface SCREEN "exp" "dmfeO" ROUTING "exp_dmfeO" INCOMPLETE SCREEN "exp" "dmfel " ROUTING "exp-dmfel " INCOMPLETE LOG SUMMARY 調べたところサーバーの成疋ミスがみつかったという例も も選べる。言求したバケットは、専用のビューアでさらに 条件を絞り込んで参照できる。この考え方は、 snoop コマ 多い。 ンドでネットワークを流れるバケットを取り込み、あとで SunScreen では、次の 2 不頁のログをとることかでき しつくり角斤する手法に通しるものがある。 る。 このログ機能を有効にするには、ルールを定義する際に ・ネットワーク・トラフィック LOG オプションを指定する。すると、該当するルールに ルールまたはインターフェイスの定義において指定する 一致したバケットがログに言求される。たとえば次のよう ことで、バケットレベルでのログか求できる。バケッ にする。 トレベルでのログは、量か膨大になる可能生がある 8 だ root@exp$ ssadm edit lnitial けでなく、パフォーマンスに与える景彡響もかなり大き Loaded common 0b 」 ects from Registry version 5 Loaded policy from lnitial version 5 い。したがって、デフォルトではオフになっているし、 edit> add rule common * * DENY LOG SUMMARY 日常的にオンにしておくこともお勧めしない。問題を分 これにより、ほかのルールに一一 - ・致せすに捨てられるバケ 析するために、インストール直後や構成の変更後に一時 ットか要約モードで言求されていく。 的にオンにする程度でよいであろう。 あるいはインターフェイス定義に LOG オプションを付 ・各種イベント けると、そのインターフェイスを通過するすべてのバケッ SunScreen の構成変更や認証の成否、プロキシーの動 トのログを残すこともできる。詳細モードでログを言求す イ伏況カ求される。ー己のネットワーク・トラフィッ るとセッションの内容まで再現できるが、そのような月立既 クとは異なり、通常 syslog を使って取得する程度のロ なログを言当求することに意味があるのかは疑問である。 グしか残らない。 広設定ガ去を図 17 に示す。 こでは、ネットワーク・トラフィックのログに絞っ ログの表示 て角見を進める。このロク機能では、ルールに一致して破 SunScreen のログはバイナリ形式のファイルであり、 棄または通過させたバケットを次の 2 つのモードで記録 そのままでは見ることができない。そこでます、ログファ する。 イルを、、 ssadm I 。 g " コマンドで処理して中間ファイルを 作成する。そして、、、 ssadm logdump ' コマンドでその 田 (DETAIL) モード ( バケット全体 ) 内容を分析する。 ・要約 (SUMMARY) モード ( バケットの地頁部分のみ ) ssadm logdump コマンドは、 snoop と同様にノヾケッ ー午可ルールにおいては、 トをフィルタリングして表小する多数のオプションを備え ている。とりあえすログを表示させるには、図 18 のよう ・セッション (SESSION) モード ( セッションの存を に入力する。これは、 I 。 g サプコマンドでログファイルを 標準出力に出力し、 logdump サプコマンドで標準入力か ら取り込んだログを表示する例である。 8 SunScreen では、デフォルトでログのサイズ制限をおこなう幼陏 効になっているため、ディスクカヾ益れる・己はない。とはいっても、記 録しただけて捨ててしまうのではたんなる資源ク馮置いである。 1 三ロ 68 UNIX MAGAZINE 2003.6