2021年07月

06

【てくさぽBLOG】WebSphere Hybrid Editionを導入してみた Vol.2 -WebSphere Liberty導入編-

こんにちは。
てくさぽBLOGメンバーの岡田です。

IBM WebSphere Hybrid Edition(以下 WSHE)の導入をAzure上で検証してみた3回シリーズの2回目になります。

本記事では前回実施したAzure上にインストールしたOpenShift4.5環境に、WebSphere Liberty Coreをインストールしていきます。

WebSphere Hybrid Editionを導入してみた Vol.1 -OpenShift導入編-
WebSphere Hybrid Editionを導入してみた Vol.2 -WebSphere Liberty導入編- *本編
WebSphere Hybrid Editionを導入してみた Vol.3 -ツール編-

1.WSHEというソフトウェアが無い?

そもそもWSHEとはどのようなソフトウェアなのでしょうか。
分かりづらいですが、WSHEライセンスを購入してもWSHEというソフトウェアが利用できるわけではありません。WSHEライセンスは以下のWebSphere ApplicationServer関連の主要な製品をまとめたものです。

WebSphere Application Serverは,従来型のWebSphere traditionalおよび,コンテナ環境にも対応したWebSphere Libertyの二種類のランタイムがあります。今回は、WebSphere Libertyランタイムをインストールしてみます。
                                        

2.作業用サーバーを用意する

今回、Azure上に構築したRHEL8サーバーに以下を導入します。*個々のインストール手順は省略

  • ocコマンド
  • podmanコマンド
  • helmコマンド

3.WebSphere Libertyのインストール

ここからは、Azure上のRHEL8サーバーにログインして行います。

(1)統合OCPレジストリーへのアクセス権を付与する

・OCPにログインします。

oc login -u kubeadmin -p  <パスワード> https://api.nicpwhecluster.xxx.com:6443

・oc get nodesでノードのホスト名を確認します。

$ oc get node
NAME STATUS ROLES AGE VERSION
nicpwhecluster-h8lq5-master-0 Ready master 4d23h v1.18.3+e574db2
nicpwhecluster-h8lq5-master-1 Ready master 4d23h v1.18.3+e574db2
nicpwhecluster-h8lq5-master-2 Ready master 4d23h v1.18.3+e574db2
nicpwhecluster-h8lq5-worker-japaneast-1 Ready worker 4d23h v1.18.3+e574db2
nicpwhecluster-h8lq5-worker-japaneast-2 Ready worker 4d23h v1.18.3+e574db2
nicpwhecluster-h8lq5-worker-japaneast-3 Ready worker 4d23h v1.18.3+e574db2

・今回はマスターノードの1つ「nicpwhecluster-h8lq5-master-0」で実行します。クラスタから内部経路を使ってレジストリにアクセスします。

$ oc debug nodes/nicpwhecluster-h8lq5-master-0
Starting pod/nicpwhecluster-h8lq5-master-0-debug …
To use host binaries, run `chroot /host`
Pod IP: 10.0.0.7
If you don’t see a command prompt, try pressing enter.
sh-4.2#

・ノード上でocやpodmanなどのツールにアクセスできるように次のコマンドを実行します。

sh-4.2# chroot /host
sh-4.4#

・アクセストークンを使用して、コンテナイメージ・レジストリにログインします。

sh-4.4# oc login -u kubeadmin -p <パスワード> https://api.nicpwhecluster.xxx.com:6443
The server uses a certificate signed by an unknown authority.
You can bypass the certificate check, but any data you send to the server could be intercepted by others.
Use insecure connections? (y/n): yLogin successful.You have access to 58 projects, the list has been suppressed. You can list all projects with ‘oc projects’Using project “default”.Welcome! See ‘oc help’ to get started.
sh-4.4#
sh-4.4# podman login -u kubeadmin -p $(oc whoami -t) image-registry.openshift-image-registry.svc:5000
WARNING! Using –password via the cli is insecure. Please consider using –password-stdin
Login Succeeded!
sh-4.4#

・動作確認します。レジストリdocker.ioからイメージをローカルに持ってきます。

sh-4.4# podman pull docker.io/hello-world
Trying to pull docker.io/hello-world…
Getting image source signatures
Copying blob 0e03bdcc26d7 done
Copying config bf756fb1ae done
Writing manifest to image destination
Storing signatures
bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
sh-4.4#

・取得できたか確認します。

sh-4.4# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
quay.io/openshift-release-dev/ocp-v4.0-art-dev <none> e62c0ee30db5 3 weeks ago 505 MB
quay.io/openshift-release-dev/ocp-v4.0-art-dev <none> b920241dcb5e 3 weeks ago 331 MB
quay.io/openshift-release-dev/ocp-v4.0-art-dev <none> 14b9f9be4696 3 weeks ago 312 MB
(途中省略)
quay.io/openshift-release-dev/ocp-v4.0-art-dev <none> 088760d6a49a 3 weeks ago 912 MB
docker.io/library/hello-world latest bf756fb1ae65 13 months ago 20 kB
sh-4.4#

・レジストリに対してpodman pushを実行します。

sh-4.4# podman tag docker.io/hello-world image-registry.openshift-image-registry.svc:5000/openshift/hello-world
sh-4.4# podman push image-registry.openshift-image-registry.svc:5000/openshift/hello-world
Getting image source signatures
Copying blob 9c27e219663c done
Copying config bf756fb1ae done
Writing manifest to image destination
Storing signatures
sh-4.4#
(2)統合OCPレジストリーのエクスポーズ

・DefaultRoute を 「True」にします。

$ oc patch configs.imageregistry.operator.openshift.io/cluster –patch ‘{“spec”:{“defaultRoute”:true}}’ –type=merge
config.imageregistry.operator.openshift.io/cluster patched (no change)
$

・podmanでログインします。

$ HOST=$(oc get route default-route -n openshift-image-registry –template='{{ .spec.host }}’)
$ echo $HOST
default-route-openshift-image-registry.apps.nicpwhecluster.xxx.com
$
$ oc whoami -t
M3Dbj0zF2oK68yG21jf7WTV37XeWR8EKRagF62QJOL0
$
$ podman login -u kubeadmin -p <パスワード> –tls-verify=false $HOST
Login Succeeded!
(3)SecurityContextConstraints (SCC) の定義

https://github.com/IBM/charts/tree/master/stable/ibm-websphere-liberty内の記載から以下の赤枠箇所の内容を含んだyamlファイルを作成します。今回はibm-websphere-liberty-scc.yamlという名前で作成しました。

・oc applyコマンドでibm-websphere-liberty-scc を定義します。

$ oc apply -f ./ibm-websphere-liberty-scc.yaml
securitycontextconstraints.security.openshift.io/ibm-websphere-liberty-scc created
(4)プロジェクトwlp-sample作成

Websphere Liberty用にプロジェクトを作成します。今回は、Webコンソールから「wlp-sample」という名前で作成します。

(5)コンテナ・イメージのビルド

・server.xmlの用意
https://github.com/WASdev/ci.docker/blob/master/ga/latest/full/server.xml内の、36行あるserver.xmlの内容をコピーし、ファイルserver.xmlを作成します。

・以下の内容のDockerファイルを作成します。

FROM ibmcom/websphere-liberty:19.0.0.12-full-java8-ibmjava-ubi
COPY –chown=1001:0? server.xml /config/
RUN installUtility install –acceptLicense defaultServer

・コンテナ・イメージをビルドします。

$ podman build -f ./Dockerfile -t mylibertyapp:1.0
STEP 1: FROM ibmcom/websphere-liberty:19.0.0.12-full-java8-ibmjava-ubi
Getting image source signatures
Copying blob 58e1deb9693d done
Copying blob 78afc5364ad2 done
Copying blob 3325260754e7 done
Copying blob 4427719dd2c9 done
Copying blob c059e0bc6ac9 done
Copying blob 0169ad963667 done
Copying blob 6195cb089ab9 done
Copying blob 9f87c21e1265 done
Copying blob 725fc7f0231d done
Copying blob 0331a4de6fdc done
Copying blob bdab1c39af4a done
Copying blob f5b53ae0ca41 done
Copying config ce3acc7fda done
Writing manifest to image destination
Storing signatures
STEP 2: COPY –chown=1001:0 server.xml /config/
fbd6f3d9cba9a7a72ac7a0dc3e3011b6400fdb2fd3e21fa34959dfe1925af803
STEP 3: COPY –chown=1001:0 SampleWebApp.war /config/dropins/
d64e1ce4931688a84d354446fbd4fa9f4744ef65cdcb187f830a2c9ea114dff8
STEP 4: RUN installUtility install –acceptLicense defaultServer
Checking for missing features required by the server …
The server does not require any additional features. No features were installed.Start product validation…
Product validation completed successfully.
STEP 5: COMMIT mylibertyapp:1.0
515b092feddf7a2ebb165bbdab187bbfd54bf3bf09b55651b990b7da5b76f767
$

・作成されたイメージを確認します。

$ podman images | grep myliberty
localhost/mylibertyapp     1.0      515b092feddf      28 seconds ago     738 MB
$
(6)Buildしたコンテナイメージを統合OCPレジストリーにpush

・まず統合OCPレジストリーへログインします。

$ podman login default-route-openshift-image-registry.apps.nicpwhecluster.xxx.com -u kubeadmin -p 75tT5caixaa_Mm7K6HiVT6xvbyFWeoHf1Dp1soB-21Y –tls-verify=false
Login Succeeded!
$

・ビルドしたイメージに統合OCPレジストリーのホスト名とプロジェクトを示す名前を付与します。
実行したらpodman imagesコマンドで確認します。

$ podman tag mylibertyapp:1.0 default-route-openshift-image-registry.apps.nicpwhecluster.xxx.com/wlp-sample/mylibertyapp:1.0

$ podman images | grep myliberty
localhost/mylibertyapp 1.0 515b092feddf 5 minutes ago 738 MB
default-route-openshift-image-registry.apps.nicpwhecluster.xxx.com/wlp-sample/mylibertyapp 1.0 515b092feddf 5 minutes ago 738 MB
$

・統合OCPレジストリーへコンテナ・イメージを登録(push)します。

$ podman push default-route-openshift-image-registry.apps.nicpwhecluster.xxx.com/wlp-sample/mylibertyapp:1.0 –tls-verify=false
Getting image source signatures
Copying blob 995a5e8c59d9 done
Copying blob 9e4e9b467e1d done
Copying blob 18bd03b00625 done
Copying blob 33037ee11bc5 done
Copying blob 1d7ab3c032a8 done
Copying blob da31cc4e7dec done
Copying blob eeb6d8f926af done
Copying blob 1228a4ab5ec0 done
Copying blob 1235447b1b10 done
Copying blob 60d1e32eff28 done
Copying blob 6ab8cd79d784 done
Copying blob 86b23fed23f4 done
Copying blob 597be5f3fcff done
Copying blob 7dd002d4a36c done
Copying blob 6a5e24c477f6 done
Copying config 515b092fed done
Writing manifest to image destination
Copying config 515b092fed done
Writing manifest to image destination
Storing signatures
$

・コンテナ・イメージが統合OCPレジストリーにpushされたことを確認します。

$ oc get imagestream
NAME IMAGE REPOSITORY TAGS UPDATED
mylibertyapp default-route-openshift-image-registry.apps.nicpwhecluster.xxx.com/wlp-sample/mylibertyapp 1.0 55 seconds ago$ oc describe imagestream mylibertyapp
Name: mylibertyapp
Namespace: wlp-sample
Created: About a minute ago
Labels: <none>
Annotations: <none>
Image Repository: default-route-openshift-image-registry.apps.nicpwhecluster.xxx.com/wlp-sample/mylibertyapp
Image Lookup: local=false
Unique Images: 1
Tags: 11.0
no spec tag* image-registry.openshift-image-registry.svc:5000/wlp-sample/mylibertyapp@sha256:bc6bc8fac41fd59b42d37e02888a3348f057c5caa0d8b41fd74d9e9f4aabdab4
About a minute ago
$
(7)SCCをサービス・アカウントに付与(grant)

・(3)で作成したibm-websphere-liberty-sccをWebSphere Libertyが使用するサービス・アカウントに付与します。

$ oc project wlp-sample

$ oc adm policy add-scc-to-user ibm-websphere-liberty-scc -z mylibertyapp-ibm-websphe
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:ibm-websphere-liberty-scc added: “mylibertyapp-ibm-websphe”
$

(8)WebSphere LibertyのPodをデプロイ

・Helm Chartから変数ファイルを抽出します。
*WebSphere Liberty用helm Chart(「ibm-websphere-liberty-1.10.0.tgz」)をhttps://github.com/IBM/charts/tree/master/repo/stable からダウンロードしておきます。

$ helm inspect values ./ibm-websphere-liberty-1.10.0.tgz > mylibertyapp.yaml

・抽出した変数ファイルをエディタで開いてパラメーターを修正します。今回は以下の2箇所を更新しました。

ー (変更前)license: “”  ⇒ (変更後)license: “accept”
ー (変更前)ssl: enabled: true ⇒ (変更後)ssl: enabled: false

・修正した変数ファイルを指定して「helm install」コマンドを実行し、デプロイします。

$ helm install mylibertyapp ./ibm-websphere-liberty-1.10.0.tgz -f ./mylibertyapp.yaml
NAME: mylibertyapp
LAST DEPLOYED: Mon Mar 1 08:26:17 2021
NAMESPACE: wlp-sample
STATUS: deployed
REVISION: 1
NOTES:
+ If you are running on IBM Cloud Kubernetes Service, get the application address by running these commands:
ibmcloud cs workers $(kubectl config current-context)
export NODE_IP=<Worker node public IP from the first command>
export NODE_PORT=$(kubectl get –namespace wlp-sample -o jsonpath=”{.spec.ports[0].nodePort}” services mylibertyapp-ibm-websphe)
echo Application Address: http://$NODE_IP:$NODE_PORTOtherwise, run the following commands:
export NODE_IP=$(kubectl get nodes -l proxy=true -o jsonpath=”{.items[0].status.addresses[?(@.type==\”Hostname\”)].address}”)
export NODE_PORT=$(kubectl get –namespace wlp-sample -o jsonpath=”{.spec.ports[0].nodePort}” services mylibertyapp-ibm-websphe)
echo Application Address: http://$NODE_IP:$NODE_PORT
$

・正常にデプロイできたか確認します。

$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mylibertyapp wlp-sample 1 2021-03-01 08:26:17.876891227 +0000 UTC deployed ibm-websphere-liberty-1.10.0 19.0.0.6
$

・作成された主要なOCPリソースの一覧と状況を確認します。

$ oc get all -l app=mylibertyapp-ibm-websphe
NAME READY STATUS RESTARTS AGE
pod/mylibertyapp-ibm-websphe-76478c8fcd-ngqpp 1/1 Running 0 82sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mylibertyapp-ibm-websphe NodePort 172.30.179.226 <none> 9080:30797/TCP 82sNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mylibertyapp-ibm-websphe 1/1 1 1 82sNAME DESIRED CURRENT READY AGE
replicaset.apps/mylibertyapp-ibm-websphe-76478c8fcd 1 1 1 82s
$
(9)手作業でRouteを定義し、WebSphere Libertyにアクセスします

・作成されたServiceを確認します。

$ oc get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mylibertyapp-ibm-websphe NodePort 172.30.179.226 <none> 9080:30797/TCP 112s

・Routeを作成します。

$ oc expose service mylibertyapp-ibm-websphe
route.route.openshift.io/mylibertyapp-ibm-websphe exposed
$

・RouteのHOST名を確認します。

$ oc get route
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
mylibertyapp-ibm-websphe mylibertyapp-ibm-websphe-wlp-sample.apps.nicpwhecluster.xxx.com mylibertyapp-ibm-websphe http None
$

・最後に、Webページにアクセスしてみます。
ー コマンドの場合

$ curl -s http://mylibertyapp-ibm-websphe-wlp-sample.apps.nicpwhecluster.xxx.com
<!DOCTYPE html>
<html lang=”en” xml:lang=”en”>
<head>
<meta charset=”utf-8″ name=”viewport”
content=”width=device-width,initial-scale=1.0″>
<!–title data-externalizedString=”WELCOME_TITLE”></title–>
<title>WebSphere Liberty 19.0.0.12</title>
<style>
@font-face {
font-family: IBMPlexSans-Medium;
src: url(‘fonts/IBMPlexSans-Medium.woff’);
}
(以下、省略)

ー Webブラウザの場合

4.まとめ

いかがでしたでしょうか。
コンテナ版なのでインストールは簡単かな、と思っていたのですが実行するコマンドも多くて結構大変だった印象です。大まかには「コンテナイメージのビルド」⇒「OCPレジストリにプッシュ」⇒「Podのデプロイ」という流れなのですがそれぞれの工程ごとにいろいろなコマンドを打つ必要があるので、実際にやってみようと思われている方の参考になればと思います。

ここまでお読みいただきありがとうございました。
次回はWSHEで利用可能な各種ツール群をインストールしてみた内容をお伝えいたします。

 

お問い合わせ

この記事に関するご質問は下記までご連絡ください。

エヌアイシー・パートナーズ株式会社
技術支援本部

E-Mail:nicp_support@NIandC.co.jp
 

その他の記事

2025年10月22日

今こそ着手すべきセキュリティ対策:サイバーレジリエンス法(CRA)とSBOMの関係

公開日:2025-10-22 目次 はじめに:CRAとSBOMがもたらす変革 CRAが企業に課す義務とタイムライン SBOMの必要性・重要性:CRA対応を超えて CRAとSBOMの具体的な関係 SBOM生成・活用ツールのご紹介 まとめ:SBOMはCRA準拠と持続的な品質維持の鍵 お問い合わせ はじめに:CRAとSBOMがもたらす変革 「サイバーレジリエンス法(CRA)」は、EU市場で流通する「デジタル要素を持つ製品」(ハードウェア、ソフトウェア、IoTデバイスなど)のセキュリティ水準向上を目指し、EUが策定した新たな規制です。この法規制への対応において、中核的な役割を果たすのが「SBOM(Software Bill of Materials:ソフトウェア部品表)」です。 SBOMは、CRA対応に不可欠な構成要素であると同時に、本来ソフトウェアの脆弱性管理やセキュリティ維持を実現するための根本的な情報基盤です。CRAの有無にかかわらず、自社製品の安全性と品質管理の観点から、その導入は急務と言えます。 本記事では、CRA対応に求められるSBOMの具体的な要件と、それが企業のセキュリティにもたらす本質的な貢献についてご説明いたします。 CRAが企業に課す義務とタイムライン CRAは、製品開発の設計段階(Secure by Design)からのセキュリティ考慮を徹底し、製品提供後の脆弱性管理までを一連の義務として企業に課します。主な要件は以下のとおりです。 Secure by Designの文書化:設計段階でセキュリティを考慮した証拠を文書として整備し、補完すること。 脆弱性の特定と報告:製品に含まれる脆弱性を特定・文書化し、迅速に公開する義務。 SBOMの整備:製品構成を「一般的な形式で機械可読」な形で作成し、技術文書の一部とすること。 特に日本企業が留意すべき適用スケジュールは以下の通りです。 日付 義務内容 内容 2026年9月11日 脆弱性およびインシデントの報告義務の適用開始 悪用された脆弱性やセキュリティインシデントについて、EU内の当局へ24時間以内に報告することが求められます。 2027年12月11日 CRA全面施行、CEマーク非取得製品の販売禁止 この日以降、CRAの全要件を満たしCEマークを取得しない製品は、EU市場での販売が原則として禁止されます。 SBOMの必要性・重要性:CRA対応を超えて SBOMは、ソフトウェアに含まれるすべてのコンポーネントや依存関係を網羅的に記録し、脆弱性発生時の迅速な影響範囲の特定と市場対応を可能にするリストです。 2021年12月のLog4j問題*1が示したように、SBOMの有無は企業の対応速度を決定づけます。SBOMが整備されていれば、脆弱性の影響範囲を素早く特定し、迅速な対応が可能となります。逆にSBOMがなければ、企業は重大な潜在的脆弱性を抱えた製品を市場に出し続け、ユーザーのセキュリティリスクを増大させることになります。 このように、CRAの法的要求以前に、SBOMは製品構造を把握し、リスクを継続的に管理するための不可欠なツールです。 *1.脆弱性の重大度を示すCVSSスコアが10点中10点であった、極めて重大な脆弱性。 CRAとSBOMの具体的な関係 CRAは、SBOMを技術文書の一部として位置づけ、「製品の最上位レベルの依存関係を網羅し、一般的に使用される機械可読な形式で作成すること」を義務付けています(附属書I、Part II (1))。 脆弱性への迅速な対応の根幹 SBOMがなければ、製品に含まれるオープンソースの脆弱性情報を把握できず、CRAが求める迅速な脆弱性公開と対応(ユーザーやWebサイトでの情報提供)は実現困難です。CRAが求める「脆弱性を速やかに提出せよ」という要求に応えるための基盤情報こそがSBOMです。 技術文書としての準拠証明 CRAでは、市場監査当局から要請があった場合、製品が要求事項に準拠していることを証明するための情報・文書の提供が義務付けられています。SBOMは、「Secure by Design」の設計思想と継続的な脆弱性管理が実施されていることの客観的な証拠として、極めて重要な役割を果たします。 SBOMは、ソフトウェアの構造把握による脆弱性管理という主目的とともに、CRA準拠を達成するための重要な鍵となります。 SBOM生成・活用ツールのご紹介 CRA準拠のためには、製品の提供形態や開発プロセスに応じ、適切なツールを利用してSBOMを効率的かつ正確に生成・管理する必要があります。 ソースコードを所持している場合:SCA(ソフトウェア・コンポジション解析) オープンソース活用が不可欠なソフトウェア開発では、使用しているライブラリと、それに内在する脆弱性を把握するために、「SCA(Software Composition Analysis/ソフトウェア・コンポジション解析)」が必要です。 ソリューション:HCL AppScan on Cloud の SCA 機能 HCL AppScan on Cloud の SCA 機能は、ソースコード内の依存関係ファイルを解析し、ソフトウェア内のOSSコンポーネントを検出、脆弱性を持つものを特定します。 OSS情報の検出と脆弱性特定:ソースコードからOSS情報を検出し、脆弱性を持つコンポーネントを特定します。 業界標準フォーマット対応:SBOM出力の業界標準の一つであるSPDX 2.3フォーマットに対応。これはCRAが要求する「一般的に使用され、機械可読な形式」でのSBOM作成に貢献します。 バイナリデータからSBOMを生成する場合 組み込みソフトウェアやファームウェア、あるいはサプライヤーから受け取ったソースコードがない(またはアクセスできない)バイナリデータのセキュリティを検証したい場合に有効なのが、バイナリ解析ツールです。 ソリューション:SBOMスキャナ サイエンスパーク社の「SBOMスキャナ」は、以下のユニークな特色を持ちます。 バイナリデータからのSBOM生成: PCアプリケーションやWebサイトだけでなく、監視カメラ、ネットワーク機器、IoTデバイスなどの組み込みソフトウェアのバイナリデータからも、簡単にSBOMを生成します。 脆弱性レポートの生成:生成したSBOM情報(OSSのベンダー、プロダクト、バージョン)とCVE(Common Vulnerabilities and Exposures:脆弱性に付与される識別番号)を突き合わせ、脆弱性レポートを迅速に生成します。 オフライン対応:オフライン環境での利用が可能であり、機密性の高い環境でも安心して利用できます。 まとめ:SBOMはCRA準拠と持続的な品質維持の鍵 CRAの適用期限が目前に迫る今、SBOMによる効率的な脆弱性管理が、CRA準拠を成功させる鍵です。 SBOMは単なる法対応のための手段ではなく、企業が持続的にソフトウェアの品質を維持し、安全な製品を市場に提供するための基本情報基盤です。 法施行に向けたタイムラインを強く意識し、本記事で紹介したような適切なツールを活用して、迅速にSBOMの整備に着手することが、企業の競争力維持に不可欠です。 ご紹介したソリューション 【HCL AppScan on Cloud】 HCL AppScan(エヌアイシー・パートナーズ株式会社 サイト (AppScan 全般)) HCL AppScan on Cloud(HCLSoftware サイト(開発元)) ※HCL AppScan on Cloud の SCA 機能は、HCL AppScan on Cloudのオプションです。 【SBOMスキャナ】 SBOMスキャナ(エヌアイシー・パートナーズ株式会社 サイト) SBOMスキャナ(株式会社サイエンスパーク サイト(開発元)) お問い合わせ 上記製品についてのお問い合わせ、ご説明のご依頼、お見積り依頼など、エヌアイシー・パートナーズまでご相談ください。 エヌアイシー・パートナーズ株式会社技術企画本部E-mail:voice_partners@niandc.co.jp   .bigger { font-size: larger; } .highlighter { background: linear-gradient(transparent 50%, #ffff52 90% 90%, transparent 90%); } .anchor{ display: block; margin-top:-20px; padding-top:40px; } .btn_A{ height:30px; } .btn_A a{ display:block; width:100%; height:100%; text-decoration: none; background:#eb6100; text-align:center; border:1px solid #FFFFFF; color:#FFFFFF; font-size:16px; border-radius:50px; -webkit-border-radius:50px; -moz-border-radius:50px; box-shadow:0px 0px 0px 4px #eb6100; transition: all 0.5s ease; } .btn_A a:hover{ background:#f56500; color:#999999; margin-left:0px; margin-top:0px; box-shadow:0px 0px 0px 4px #f56500; } .table { border-collapse: collapse; border-spacing: 0; width: 100%; } .td { padding: 10px; vertical-align: top; line-height: 1.5; } .tbody tr td:first-child { font-weight: bold; width: 20%; } .tbody tr td:last-child { width: 80%; } .ul { margin: 0 !important; padding: 0 0 0 20px !important; } .ol { margin: 0 !important; padding: 0 0 0 20px !important; } .tr { height: auto; } .table { margin: 0; } *, *:before, *:after { -webkit-box-sizing: inherit; box-sizing: inherit; } .html { -webkit-box-sizing: border-box; box-sizing: border-box; font-size: 62.5%; } .btn, a.btn, button.btn { font-size: 1.6rem; font-weight: 700; line-height: 1.5; position: relative; display: inline-block; padding: 1rem 4rem; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-transition: all 0.3s; transition: all 0.3s; text-align: center; vertical-align: middle; text-decoration: none; letter-spacing: 0.1em; color: #212529; border-radius: 0.5rem; } a.btn--orange { color: #fff; background-color: #eb6100; border-bottom: 5px solid #b84c00; } a.btn--orange:hover { margin-top: 3px; color: #fff; background: #f56500; border-bottom: 2px solid #b84c00; } a.btn--shadow { -webkit-box-shadow: 0 3px 5px rgba(0, 0, 0, .3); box-shadow: 0 3px 5px rgba(0, 0, 0, .3); }

2025年10月10日

現地からお届け!【参加レポート】IBM TechXchange 2025 Orlando

公開日:2025-10-10 こんにちは。 現在エヌアイシー・パートナーズ 技術企画本部のメンバーで、アメリカのオーランドで開催されている「IBM TechXchange 2025」に参加しています。 (現地時間:2025年10月9日、日本時間:2025年10月10日時点) 本記事では 現地からの速報 として、このイベントの概要や見どころ、最新情報をお伝えいたします。 目次 イベント概要 IBM Techxchange 2025 主要メッセージ - 1. Anthropicとのパートナーシップ発表 - 2. コード開発AI Agent「Project Bob」 - 3. AI基盤のための「Project Infragraph」 AI Accelerator “Spyre” Observability さいごに お問い合わせ イベント概要 IBM TechXchange は世界各国のIBMファンが集う年に1度の技術者向けイベントで、今年は3回目となりました。 年々規模も参加者も拡大しており、IBM TechXchange 2025 では、1,800以上の技術者向けセッションがあり、その中で400以上のハンズオンラボやデモが展開されています。 今年はアメリカのフロリダ州にあるオーランドの Orange Country Convention Center にて10月6日から10月9日の4日間で開催中で、日本から100名近くの方々が参加しています。 今年のテーマは「we are GO / Explore Build Launch 」です。 IBM Techxchange 2025 主要メッセージ TechXchange 2025の基調講演では、AIエージェントを活用・展開するために必要となる4つの要素を紹介していました。 この4つの要素のうちEcosystem・Developer Tools・AI infrastructure managementについてお伝えします。 Ecosystem IBMが単独でAIエージェントを開発・展開するのではなくパートナーシップやIBMパートナーがAIエージェントを開発・運用することでOpenな展開をしていくという方針となります。 この方針を実現するためにAgent Connectプログラムを展開しており、多数のAIエージェントを早期に提供することを目指しています。 Developer Tools Developer Toolsとしてドメインエージェントの提供があります。 ドメインエージェントとは、業務特化型のエージェントを指します。例えば購買業務に特化したエージェントであったり、人事業務に特化したエージェントです。 AI infrastructure management AIを利用する上で必要となる基盤の管理を指します。これを実現するためにProject “Infragraph” というプロジェクトでソリューション提供を目指しています。   他にも、TechXchangeでは様々な新しい発表がありました。その発表の中から今後大注目となる3点について共有します。 1.  Anthropicとのパートナーシップ発表 既に日本でもニュースとなっているので認識されている方も多いと思いますが、Anthropicとのパートナーシップの発表がありました。 IBMはAIのガバナンス、セキュリティ、オブザーバビリティ分野でソリューションを提供しており、これがIBMの強みとなっています。Anthropicとの協業は、この強みを背景とした補完的なパートナーシップであると思われます。 このパートナーシップの目的は、LLMであるClaudeをIBMソリューションに組み込むことだけではありません。企業ユースでAIエージェントを開発・運用する時に検討が必要となる要素を体系化した「Architecting secure enterprise AI agents with MCP」をIBMが作成し、Anthropicがそれを検証する協業も行っています。 このガイドを参照してAIエージェントを開発することで、今後拡大が見込まれるAIエージェントを安全かつ安心して活用できるベースとすることができます。 2.  コード開発AI Agent「Project Bob」 統合開発環境(IDE)をエージェント型で提供する「Project Bob」が発表されました。 このニュースと共にかわいらしいマスコットのBobもお披露目になりました。 Project Bobを利用することで、コードをバージョンアップするための設計、テストの自動化、本番運用、コンプライアンス維持と開発のライフサイクル全体をAIエージェントを用いて自動化することができます。 Project Bobは、発表と共にPublicプレビュー段階に入りました。 開発者のワークフロー負荷を軽減してくれるProject Bob の提供開始が楽しみですね! 3.  AI基盤のための「Project Infragraph」 HashiCorpが主体となって開発している基盤自動化のためのプロジェクトです。 詳細は不明ですが、以下の実現を目指しています。 サイロを横断した統合インサイト クラウドインフラストラクチャーリソースを単一のビューで把握できます。 実用的なインテリジェンス コストの最適化、ガバナンスの強化、リスクの軽減に役立つコンテキストを提供します。 自動化の基盤 インフラストラクチャークラウド全体にわたる、次世代のインテリジェントなAI駆動型運用を実現します。 AI Accelerator “Spyre” IBM Spyre Accelerator はエンタープライズワークフロー向けのAIソリューションを提供し、AIサービスを簡単にインストール・構成・移動できる統合された推論プラットフォームとアクセラレートされたインフラストラクチャーを備えています。 Spyreのユースケースとしては、IT運用、開発、ERP、銀行・金融、ヘルスケア、保険、公共分野など、様々な業界でデジタルアシスタント、データ・コンテンツ管理、ディーププロセス統合などのプリビルドAIサービスを提供します。 Observability AI Firstとして各種機能提供、Intelligent、Integrated experienceとしてUIやDataレイヤーの統合がされるという情報が共有されました。 またAIキーワードとしてはLLMやAIのワークロードをInstanaでObservabilityする機能が2025 4Qのロードマップとして示されました。 さいごに 2日目の夜のお楽しみとして「Evening Entertainment at Universal Orlando Resorts Islands of Adventure」が開催されました。 世界各国から集まった技術者とともに過ごした Universal Orlando Resorts Islands of Adventure での一夜は格別な体験となりました。 さて、本日、来年のTechXchangeがアメリカ ジョージア州の「アトランタ」で開催されることが正式に発表されました。 次回のイベントにも期待が高まります! お問い合わせ エヌアイシー・パートナーズ株式会社 技術企画本部 E-mail:voice_partners@niandc.co.jp   .bigger { font-size: larger; } .highlighter { background: linear-gradient(transparent 50%, #ffff52 90% 90%, transparent 90%); } .anchor{ display: block; margin-top:-20px; padding-top:40px; } .btn_A{ height:30px; } .btn_A a{ display:block; width:100%; height:100%; text-decoration: none; background:#eb6100; text-align:center; border:1px solid #FFFFFF; color:#FFFFFF; font-size:16px; border-radius:50px; -webkit-border-radius:50px; -moz-border-radius:50px; box-shadow:0px 0px 0px 4px #eb6100; transition: all 0.5s ease; } .btn_A a:hover{ background:#f56500; color:#999999; margin-left:0px; margin-top:0px; box-shadow:0px 0px 0px 4px #f56500; } .table { border-collapse: collapse; border-spacing: 0; width: 100%; } .td { padding: 10px; vertical-align: top; line-height: 1.5; } .tbody tr td:first-child { font-weight: bold; width: 20%; } .tbody tr td:last-child { width: 80%; } .ul { margin: 0 !important; padding: 0 0 0 20px !important; } .ol { margin: 0 !important; padding: 0 0 0 20px !important; } .tr { height: auto; } .table { margin: 0; } *, *:before, *:after { -webkit-box-sizing: inherit; box-sizing: inherit; } .html { -webkit-box-sizing: border-box; box-sizing: border-box; font-size: 62.5%; } .btn, a.btn, button.btn { font-size: 1.6rem; font-weight: 700; line-height: 1.5; position: relative; display: inline-block; padding: 1rem 4rem; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-transition: all 0.3s; transition: all 0.3s; text-align: center; vertical-align: middle; text-decoration: none; letter-spacing: 0.1em; color: #212529; border-radius: 0.5rem; } a.btn--orange { color: #fff; background-color: #eb6100; border-bottom: 5px solid #b84c00; } a.btn--orange:hover { margin-top: 3px; color: #fff; background: #f56500; border-bottom: 2px solid #b84c00; } a.btn--shadow { -webkit-box-shadow: 0 3px 5px rgba(0, 0, 0, .3); box-shadow: 0 3px 5px rgba(0, 0, 0, .3); }

2025年10月06日

【イベントレポート】watsonx Orchestrate テクニカルワークショップ第二回 開催しました

公開日:2025-10-06 こんにちは。てくさぽブログメンバーの高村です。 2025年9月24日に第2回「watsonx Orchestrate テクニカルワークショップ」を開催しました。 第一回(7月開催)では、アップデートされた watsonx Orchestrate の基本的な使い方をご紹介しました。詳しくは、ブログ記事「【イベントレポート】watsonx Orchestrate テクニカルワークショップ第一回 開催しました」をご覧ください。 今回の第二回では、Agent Development Kit(以下、ADK) を用いた、Pythonによるエージェント開発のハンズオンを実施しました。 また、第1回同様、ハンズオン終了後にはグループに分かれてワークショップを行いました。参加者様同士が、日々の業務で抱えている課題を洗い出し、AIを活用して解決できる方法についてディスカッションし、その結果を発表する時間を設けました。参加者同士のコミュニケーションも活発に行われ、有意義な時間となりました。 それでは、当日の様子をご紹介します。 目次 watsonx Orchestrate概要 watsonx Orchestrateハンズオン- Agent Development Kitを用いたエージェント開発 ワークショップ まとめ お問い合わせ watsonx Orchestrate概要 このセッションでは、watsonx Orchestrate概要、ユースケース、ご提供プランをご紹介しました。 watsonx Orchestrateでは、ユーザーの目的や業務に合わせたエージェント開発が可能です。開発方法としては、ローコード と コーディング の両方が提供されており、ニーズに応じて選択できます。 今回のハンズオンで使用して頂く Agent Development Kit(ADK) および watsonx Orchestrate Developer Edition は、コーディングによるエージェントやツールの開発を支援するための環境です。Toolは Python または OpenAPI 定義によって開発でき、高度な実装やデバッグも柔軟に行えます。 watsonx Orchestrateのご提供プランは、Essentials Agentic、Standard Agentic、Premium Agenticの3種類があり、特に最近ご質問の多いEssentialsとStandardの規模感と費用感についても目安をご紹介させて頂きました。 watsonx Orchestrateハンズオン – Agent Development Kitを用いたエージェント開発 ハンズオンでは、ADK と watsonx Orchestrate Developer Edition を使い、実際にエージェント開発を体験していただきました。 参加者には事前に IBM Technology Zone(以下、Techzone) の ADK 環境を予約していただき、VSCode がインストールされた環境で開発を進めました。VSCode上でADKを利用し、完成したエージェントを watsonx Orchestrate Developer Edition にインポートして動作確認を行う流れです。 実施内容 Tool・Agent の作成 watsonx Orchestrate Developer Editionで Agent の動作確認 Knowledge を使用する Agent の作成 内部基盤モデルの追加 Flow の作成 実施した内容の中でTool、エージェントの作成とwatsonx Orchestrate Developer Editionで エージェントの動作確認について簡単にご紹介します。 作成して頂いたエージェントは、入力フレーズを造語「ザルガリ語」に翻訳し、その文字数をカウントした後、ジョークを回答します。 まずADKから①Tool(translateToZargari)と②Tool(word_length)をPythonで定義してwatsonx Orchestrate Developer Editionへインポートします。下記画面ショットのサンプルはtool() 関数を利用することでエージェントが使用可能なツールとして定義します。 次にエージェントをyaml形式で定義し、watsonx Orchestrate Developer Editionへインポートします。下記がエージェントのサンプルです。エージェントのスタイル、基盤モデルの指定、振る舞い、使用するtoolを定義します。 最後にwatsonx Orchestrate Developer Editionでエージェントの動作確認を行います。下記画面ショットがwatsonx Orchestrate Developer Editionのホーム画面です。watsonx Orchestrate Developer Editionは本製品とほぼ同等の機能を利用することができます。 Previewでエージェントの動作確認を行い、想定通り入力フレーズがザルガリ語に翻訳され、文字数をカウント、ジョークが生成されることを確認しました。 Tool、エージェントの作成、エージェントの動作確認のハンズオンは以上です。その他のハンズオンについて詳しく知りたい方は、ブログの最後に記載している「お問い合わせ」までお気軽にご連絡ください。 ワークショップ ワークショップでは2チームにわかれて日々の業務やお客さまの業務で困っていることを洗い出し、AIでの解決方法を考えるブレインストーミングを行いました。 以下のステップで進行しました 個人作業:「時間がかかっていること」「困っていること」「やりたいのにできていないこと」を3つ挙げ、ポストイットに記入し、AIでの解決可能性を考える チーム作業:模造紙にポストイットを貼りながらカテゴリー分け、AI活用のアイデアをディスカッション。 チームで話あったことを発表 当日挙がった意見を抜粋してご紹介します。 「検索業務に関して検索結果が多すぎて回答にたどり着くまで時間がかかる」 「顧客からの質問に対する回答探しに手間取る」 「同じ質問に対して効率化できないか」 AI活用について RAGを取り入れる方法 予め質問と回答を用意しチャットボットで回答させるなど工夫が必要 といった意見が出ました。 その他、コード開発でのレビューや修正にAIを活用すること、複雑な社内手続きをスムーズにするためにAIエージェントを導入する可能性についても、意見が挙がりました。 AIでどのように解決できるか、具体的な方法まで議論が進んでいない項目もありましたが、参加者同士で現在の課題や困りごとを共有いただけたことは大きな収穫でした。 今回の意見交換が、社内の「クライアントゼロ化」や日々の業務改善の検討につながる一歩となり、今後の改善活動に活かしていただけると幸いです。 まとめ 第2回 watsonx Orchestrate テクニカルワークショップ では、ADKと watsonx Orchestrate Developer Edition を用いてコードベースのエージェント開発を体験していただきました。 後半のワークショップでは、日々の業務課題から、AI活用について活発な意見交換が行われ、技術的な学びと参加者間の交流の場となりました。 今後も、製品を実際に体験できるハンズオンと、参加者同士が交流・情報共有を行えるワークショップを継続的に開催してまいります。次回もぜひご参加いただけますと幸いです。 お問い合わせ エヌアイシー・パートナーズ株式会社技術企画本部E-mail:voice_partners@niandc.co.jp   .bigger { font-size: larger; } .highlighter { background: linear-gradient(transparent 50%, #ffff52 90% 90%, transparent 90%); } .anchor{ display: block; margin-top:-20px; padding-top:40px; } .btn_A{ height:30px; } .btn_A a{ display:block; width:100%; height:100%; text-decoration: none; background:#eb6100; text-align:center; border:1px solid #FFFFFF; color:#FFFFFF; font-size:16px; border-radius:50px; -webkit-border-radius:50px; -moz-border-radius:50px; box-shadow:0px 0px 0px 4px #eb6100; transition: all 0.5s ease; } .btn_A a:hover{ background:#f56500; color:#999999; margin-left:0px; margin-top:0px; box-shadow:0px 0px 0px 4px #f56500; } .table { border-collapse: collapse; border-spacing: 0; width: 100%; } .td { padding: 10px; vertical-align: top; line-height: 1.5; } .tbody tr td:first-child { font-weight: bold; width: 20%; } .tbody tr td:last-child { width: 80%; } .ul { margin: 0 !important; padding: 0 0 0 20px !important; } .ol { margin: 0 !important; padding: 0 0 0 20px !important; } .tr { height: auto; } .table { margin: 0; } *, *:before, *:after { -webkit-box-sizing: inherit; box-sizing: inherit; } .html { -webkit-box-sizing: border-box; box-sizing: border-box; font-size: 62.5%; } .btn, a.btn, button.btn { font-size: 1.6rem; font-weight: 700; line-height: 1.5; position: relative; display: inline-block; padding: 1rem 4rem; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-transition: all 0.3s; transition: all 0.3s; text-align: center; vertical-align: middle; text-decoration: none; letter-spacing: 0.1em; color: #212529; border-radius: 0.5rem; } a.btn--orange { color: #fff; background-color: #eb6100; border-bottom: 5px solid #b84c00; } a.btn--orange:hover { margin-top: 3px; color: #fff; background: #f56500; border-bottom: 2px solid #b84c00; } a.btn--shadow { -webkit-box-shadow: 0 3px 5px rgba(0, 0, 0, .3); box-shadow: 0 3px 5px rgba(0, 0, 0, .3); }

2025年09月30日

日本アイ・ビー・エム様主催「Women in Tech Japan 夏の会」イベント開催レポート

公開日:2025-09-30 こんにちは。エヌアイシー・パートナーズ 村上です。 2025年8月20日に、IBM様が主催されている女性エンジニア中心のコミュニティ 「Women in Tech Japan」の夏の会のイベントが開催され、弊社エヌアイシー・パートナーズは会場提供(@NI+Cガーデン)という形でご協力させていただきました。 本ブログでは、イベントの様子とそこで感じ得た学びについてご報告させていただきます。 目次 Women Tech in Japanについて 「キャリアを考える」セッションから得た学び 夏のビール会! 今後の活動 さいごに お問い合わせ Women Tech in Japanについて 「Women in Tech Japan」は、2024年10月にラスベガスで開催された「TechXchange」をきっかけに発足しました。 女性エンジニアが、他社の女性エンジニアとキャリアやワークライフバランスについて語り合うことを目的としています。 日本では海外に比べてまだまだ女性エンジニアが少なく、働き方やキャリアプランを参考にするロールモデルが少ない状況ですが、女性エンジニアが輝いているIBM様がこのコミュニティをリードしてくださり、沢山の発見や学びを培う機会を作ってくださっています。 Women in Tech Japanは男性の参加も大歓迎とされていらっしゃいます。 夏の会のイベント当日は、性別や年齢、所属企業を問わず、多様なバックグラウンドを持つ方々が参加されました。 「キャリアを考える」セッションから得た学び イベントのハイライトの一つは、「キャリアを考える」をテーマにした日本アイ・ビー・エム 大久保そのみ様のセッションでした。 大久保様は国家資格キャリアコンサルトとしても活躍していらっしゃいます。 セッションから得る学びは人によって違うと思いますが、私は下記のような学びを得ましたのでご紹介です。 キャリアの選択肢は一つではなく、個々のライフスタイルや目標に合わせて柔軟に設計していくことが大切- 5年後の私が当たり前のようにイメージできなくてもいい(来年の自分を思い描く) 限られた時間をどう有効に使うかを考え実践する - 例えば・・「やりたいと思っているのに出来ていないこと」に踏み出す! 毎日をできるだけポジティブエネルギーで満たしてみたいと思うようになれた - ネガティブなことへの向き合い方を見直す 参加者の皆さまとは、その後の懇親会で本セッションの意見交換をさせていただくことができました。 大久保様、大変有意義なセッションをありがとうございました! 夏のビール会! 夕方からはNI+Cガーデンに設置しているビールサーバーをご利用いただき「夏のビール会」と称して参加者の皆さんと懇親会を行いました。 美味しい食事とクラフトビールを囲み、参加者の皆さんの会話も弾み、和やかな雰囲気となりました。 セッションでは聞けなかったキャリアの話や、日頃のちょっとした悩みを相談したりと、あっという間に時間が過ぎていきました。 このような素晴らしい機会を企画してくださった日本アイ・ビー・エムの皆様に、心より感謝申し上げます。 今後の活動 「Women tech in Japan」は、今後は下記のような継続的な活動が予定されています。 TechXchange フロリダ・オーランド にて「Empowering Women in Tech with AI」セッション(2025年10月7日)IBM TechXchange 2025 We are GO/(IBMサイト) TechXchange Japan での活動紹介(2025月12月3日)IBM TechXchange Summit Japan 2025(IBMサイト) さいごに 昨今、IT業界に限らず、共通のカテゴリーを持つ人々が集まるコミュニティが数多く存在しています。 初めてのコミュニティへの参加には、誰もが多少なりともハードルの高さを感じるかもしれません。 私自身もそうでしたが、もし少しでも興味があるなら、ぜひ一歩踏み出して参加してみることをお勧めします。 きっと、新しい出会いや、新しい発見があり、多くの経験を得ることができると思います! この度は、IBM様が主催された素晴らしいイベントに貢献できたことを、大変光栄に思います。 弊社としましては、今後もこのようなコミュニティの活動に積極的に参加・支援させていただき、女性エンジニアがさらに活躍できる社会の実現に貢献していきたいと考えております。 お問い合わせ エヌアイシー・パートナーズ株式会社E-mail:voice_partners@niandc.co.jp   .bigger { font-size: larger; } .highlighter { background: linear-gradient(transparent 50%, #ffff52 90% 90%, transparent 90%); } .anchor{ display: block; margin-top:-20px; padding-top:40px; } .btn_A{ height:30px; } .btn_A a{ display:block; width:100%; height:100%; text-decoration: none; background:#eb6100; text-align:center; border:1px solid #FFFFFF; color:#FFFFFF; font-size:16px; border-radius:50px; -webkit-border-radius:50px; -moz-border-radius:50px; box-shadow:0px 0px 0px 4px #eb6100; transition: all 0.5s ease; } .btn_A a:hover{ background:#f56500; color:#999999; margin-left:0px; margin-top:0px; box-shadow:0px 0px 0px 4px #f56500; } .table { border-collapse: collapse; border-spacing: 0; width: 100%; } .td { padding: 10px; vertical-align: top; line-height: 1.5; } .tbody tr td:first-child { font-weight: bold; width: 20%; } .tbody tr td:last-child { width: 80%; } .ul { margin: 0 !important; padding: 0 0 0 20px !important; } .ol { margin: 0 !important; padding: 0 0 0 20px !important; } .tr { height: auto; } .table { margin: 0; } *, *:before, *:after { -webkit-box-sizing: inherit; box-sizing: inherit; } .html { -webkit-box-sizing: border-box; box-sizing: border-box; font-size: 62.5%; } .btn, a.btn, button.btn { font-size: 1.6rem; font-weight: 700; line-height: 1.5; position: relative; display: inline-block; padding: 1rem 4rem; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-transition: all 0.3s; transition: all 0.3s; text-align: center; vertical-align: middle; text-decoration: none; letter-spacing: 0.1em; color: #212529; border-radius: 0.5rem; } a.btn--orange { color: #fff; background-color: #eb6100; border-bottom: 5px solid #b84c00; } a.btn--orange:hover { margin-top: 3px; color: #fff; background: #f56500; border-bottom: 2px solid #b84c00; } a.btn--shadow { -webkit-box-shadow: 0 3px 5px rgba(0, 0, 0, .3); box-shadow: 0 3px 5px rgba(0, 0, 0, .3); }

back to top