Docker ile Node.js Uygulaması Oluşturma

1 dakika tahmini okuma süresi

  1. Sabit etiketler ve minimal imajlar kullanın

Mümkün ise mutlaka Node.js LTS sürümlerini sabit etiket ile kullanın, sabit etiket kullanmak güvenlik yamalarını otomatik olarak almayı engellese de kontrolsüz güncellemelerin uygulamanızı kırmasını engeller.

FROM node:12.2.0-alphine
  1. Küçük ve güvenli imajları için çok aşamalı derleme kullanın

İmaj derlemesi sırasında ihtiyaç duyabileceğiniz şifreleri ya da hassas bilgileri ara katmanlarda kullanarak, son imaja hiçbir hassas verinin ulaşmamasını sağlayabilirsiniz.

Farklı katmanlarda farklı imajlar kullanılabileceği gibi, son katmanda mümkün ise minimal imajlar tercih edin (*-alpine gibi). Minimal imajlar daha az saldırı yüzeyi ve daha güvenli uygulama imajları demektir.

FROM node:12.2.0 AS build-env

ARG github_token_arg=default_value
ENV github_token=$github_token_arg

...

FROM node:12.2.0-alpine AS runtime-env

...

Örnekteki github_token_arg asağıdaki gibi --build-arg parametresi kullanılarak sağlanabilir.

docker build --build-arg github_token_arg=1234 -t myapp .
  1. Npm kütüphanelerini ayrı bir katmanda yükleyin

Bunun temelde iki faydası vardır:

  • Üst üste yapılan derlemelerde önbelleğe alınmış Docker katmanlarından faydalanmamızı sağlar
  • package.json dosyasında belirtilen kütüphane versiyonları otomatik olarak sabitlenmiş olur
FROM node:12.2.0 AS build-env

ARG github_token_arg=default_value
ENV github_token=$github_token_arg

# package.json and package-lock.json
COPY package*.json ./

RUN npm install --production

...

FROM node:12.2.0-alpine AS runtime-env

RUN mkdir /app

COPY --from=build-env ./ /app
...

NOT: npm install yerine npm install --production kullanmak devDependencies altındaki kütüphaneleri yüklemeyeceği icin son imaj yükünü küçültmeye fayda sağlar.

  1. En az ayrıcalıklı kullanıcı

Docker varsayılan olarak root kullanıcı ile çalışır, bu uygulamanın Docker ana bilgisayarında root kullanıcı erişimine sahip olabileceği anlamına gelir. Eger uygulamada bir güvenik açığı var ise, bu saldırı yüzeyini artırır ve ayrıcaklık yükseltme saldırıları için kolay bir yol sağlar.

FROM node:12.2.0 AS build-env

ARG github_token_arg=default_value
ENV github_token=$github_token_arg

# package.json and package-lock.json
COPY package*.json /build/

WORKDIR /build

RUN npm install --production

FROM node:12.2.0-alpine AS runtime-env

RUN mkdir /app

COPY --from=build-env --chown=node:node /build /app

USER node

WORKDIR /app

EXPOSE <uygulama portu>

CMD [“node”, “index.js”]

Riski en aza indirmek için, yukarıdaki gibi uygulamanın sadece belirli bir grup ve kullanıcı ile sınırlandırılması faydalıdır.

Referanslar:

Yorumlar

Yorum yapın

Email adresiniz gösterilmeyecektir. Zorunlu alanlar işaretlenmiştir *

Yükleniyor...