Skip to content

Commit 65a89dc

Browse files
authored
feat: improve c2d docker image security (#1302)
* feat: improve c2d docker image security * fix: build issue * fix: make directories world writable * fix: use init container to setup permissions before running user image * fix: add logs to check status of init volume * fix: try changing permissions at job start * fix: allow root cache as tmpfs * fix: use absolute path * chore: review * feat: disable readonly root fs
1 parent cdcf663 commit 65a89dc

1 file changed

Lines changed: 17 additions & 9 deletions

File tree

src/components/c2d/compute_engine_docker.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ import { dockerRegistrysAuth, dockerRegistryAuth } from '../../@types/OceanNode.
5757
import { EncryptMethod } from '../../@types/fileObject.js'
5858
import { ZeroAddress } from 'ethers'
5959

60+
const C2D_CONTAINER_UID = 1000
61+
const C2D_CONTAINER_GID = 1000
62+
6063
const trivyImage = 'aquasec/trivy:0.69.3' // Use pinned versions for safety
6164

6265
export class C2DEngineDocker extends C2DEngine {
@@ -1469,7 +1472,7 @@ export class C2DEngineDocker extends C2DEngine {
14691472
if (!jobRes[0].isRunning) return null
14701473
try {
14711474
const job = jobRes[0]
1472-
const container = await this.docker.getContainer(job.jobId + '-algoritm')
1475+
const container = this.docker.getContainer(job.jobId + '-algoritm')
14731476
const details = await container.inspect()
14741477
if (details.State.Running === false) return null
14751478
return await container.logs({
@@ -1728,6 +1731,8 @@ export class C2DEngineDocker extends C2DEngine {
17281731
// create the container
17291732
const mountVols: any = { '/data': {} }
17301733
const hostConfig: HostConfig = {
1734+
// limit number of Pids container can spawn, to avoid flooding
1735+
PidsLimit: 512,
17311736
Mounts: [
17321737
{
17331738
Type: 'volume',
@@ -1769,9 +1774,10 @@ export class C2DEngineDocker extends C2DEngine {
17691774
AttachStdin: false,
17701775
AttachStdout: true,
17711776
AttachStderr: true,
1772-
Tty: true,
1777+
Tty: false,
17731778
OpenStdin: false,
17741779
StdinOnce: false,
1780+
User: `${C2D_CONTAINER_UID}:${C2D_CONTAINER_GID}`,
17751781
Volumes: mountVols,
17761782
HostConfig: hostConfig
17771783
}
@@ -1786,8 +1792,10 @@ export class C2DEngineDocker extends C2DEngine {
17861792
containerInfo.HostConfig.Devices = advancedConfig.Devices
17871793
if (advancedConfig.GroupAdd)
17881794
containerInfo.HostConfig.GroupAdd = advancedConfig.GroupAdd
1789-
if (advancedConfig.SecurityOpt)
1790-
containerInfo.HostConfig.SecurityOpt = advancedConfig.SecurityOpt
1795+
containerInfo.HostConfig.SecurityOpt = [
1796+
'no-new-privileges',
1797+
...(advancedConfig.SecurityOpt ?? [])
1798+
]
17911799
if (advancedConfig.Binds) containerInfo.HostConfig.Binds = advancedConfig.Binds
17921800
containerInfo.HostConfig.CapDrop = ['ALL']
17931801
for (const cap of advancedConfig.CapDrop ?? []) {
@@ -1847,7 +1855,7 @@ export class C2DEngineDocker extends C2DEngine {
18471855
let container
18481856
let details
18491857
try {
1850-
container = await this.docker.getContainer(job.jobId + '-algoritm')
1858+
container = this.docker.getContainer(job.jobId + '-algoritm')
18511859
details = await container.inspect()
18521860
} catch (e) {
18531861
console.error(
@@ -1952,7 +1960,7 @@ export class C2DEngineDocker extends C2DEngine {
19521960
job.statusText = C2DStatusText.JobSettle
19531961
let container
19541962
try {
1955-
container = await this.docker.getContainer(job.jobId + '-algoritm')
1963+
container = this.docker.getContainer(job.jobId + '-algoritm')
19561964
} catch (e) {
19571965
CORE_LOGGER.debug('Could not retrieve container: ' + e.message)
19581966
job.isRunning = false
@@ -2149,7 +2157,7 @@ export class C2DEngineDocker extends C2DEngine {
21492157
this.releaseCpus(job.jobId)
21502158

21512159
try {
2152-
const container = await this.docker.getContainer(job.jobId + '-algoritm')
2160+
const container = this.docker.getContainer(job.jobId + '-algoritm')
21532161
if (container) {
21542162
if (job.status !== C2DStatusNumber.AlgorithmFailed) {
21552163
writeFileSync(
@@ -2875,7 +2883,7 @@ export class C2DEngineDocker extends C2DEngine {
28752883

28762884
if (existsSync(destination)) {
28772885
// now, upload it to the container
2878-
const container = await this.docker.getContainer(job.jobId + '-algoritm')
2886+
const container = this.docker.getContainer(job.jobId + '-algoritm')
28792887

28802888
try {
28812889
// await container2.putArchive(destination, {
@@ -2963,7 +2971,7 @@ export class C2DEngineDocker extends C2DEngine {
29632971
}
29642972

29652973
// delete output folders
2966-
await this.deleteOutputFolder(job)
2974+
this.deleteOutputFolder(job)
29672975
// delete the job
29682976
await this.db.deleteJob(job.jobId)
29692977
return true

0 commit comments

Comments
 (0)