Libseccomp: RFE: pip๋ฅผ ํ†ตํ•ด python ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 12์›” 24์ผ  ยท  9์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: seccomp/libseccomp

enhancement prioritlow

๋ชจ๋“  9 ๋Œ“๊ธ€

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ๋ คํ•  ๊ฒƒ์ด์ง€๋งŒ, ์ด๊ฒƒ์€ ํ˜„์žฌ ๋งค์šฐ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„(ํ•ญ์ƒ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ)๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ ํŒจํ‚ค์ง•/๋ฐฐํฌ์— ๋Œ€ํ•œ Python ๋ฌธ์„œ:

PR์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๋ณด๋‚ด ์ฃผ์‹  @pcmoore ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํŒŒ์ด์ฌ ๋ฐ”์ธ๋”ฉ ํŒจํ‚ค์ง•์— ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๊ณ  ์–ด์ œ ๋ฐค์— ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ ์ˆ˜์ • ์ค‘ ์ผ๋ถ€๋Š” MANIFEST.in์„ ์ถ”๊ฐ€ํ•˜๊ณ  setup.py ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. pip install ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ๋œ setup.py๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๊ฐœ๋ฐœ ๋ฒ„์ „๊ณผ ์‹ค์ œ๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์•„์ง #217์˜ ์‹คํŒจ๋ฅผ ์‚ดํŽด๋ณด์ง€๋Š” ์•Š์•˜์ง€๋งŒ ๊ณง ).

IMO, ๋” ๋‚˜์€ ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ/๋ฆด๋ฆฌ์Šค ์›Œํฌํ”Œ๋กœ๋ฅผ ์œ„ํ•ด Python ๋ฐ”์ธ๋”ฉ์„ ๋ณ„๋„์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ €๋Š” Python ํ”„๋กœ์ ํŠธ์—์„œ ์ผํ–ˆ์ง€๋งŒ Cythonized ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ทธ๋‹ค์ง€ ๋งŽ์ด ์ž‘์—…ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ œ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์—ญ๋Ÿ‰์—์„œ ๋„์›€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์ €๋Š” #61์„ ์ˆ˜์ •ํ•œ ํ›„ ๋ฌธ์„œ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค(์ด๋ฅผ ์ƒˆ ์ €์žฅ์†Œ๋กœ ์˜ฎ๊ธฐ๋ฉด ์•„๋งˆ๋„ ๋‹จ์ˆœํ™”๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ sphinx Python ๋ฌธ์„œ ๋„๊ตฌ๊ฐ€ cython ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•Œ ์ˆ˜ ์žˆ์Œ).

๋ฌธ์ œ #216์˜ @pcmoore ์˜๊ฒฌ์—์„œ:

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ณธ libseccomp ์†Œ์Šค ๋ฐฐํฌ์˜ ์ผ๋ถ€๋กœ Python ๋ฐ”์ธ๋”ฉ์„ ๊ณ„์† ์ง€์›ํ•  ๊ฒƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด golang ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ถ„ํ• ํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ํŒŒ์ด์ฌ ๋ฐ”์ธ๋”ฉ์„ ๋ฉ”์ธ libseccomp ํŒจํ‚ค์ง€์—์„œ ๋ถ„๋ฆฌํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค๊ณ , ์ €์—๊ฒŒ๋Š” ์ด๊ฒƒ์ด ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์ƒ๋‹นํžˆ ๋‚ฎ๋‹ค๋Š” ๋ฐ์—๋„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ž‘์—…์„ ์„ ํƒํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ๊ฒ€ํ† ํ•˜๋Š” ๋ฐ ๋„์›€์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. :)

BTW ํŒŒ์ด์ฌ ๋ฐ”์ธ๋”ฉ์ด ๋ณ„๋„์˜ ์ €์žฅ์†Œ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ก ์ž์›๋ด‰์‚ฌ๋Š” ์•„๋‹ˆ์ง€๋งŒ. :^)

seccomp ์กฐ์ง ์•„๋ž˜์— ์ƒˆ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์ด๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ Python ๋ฐ”์ธ๋”ฉ์„ ๊ฐ€์ ธ์™€์„œ PR์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Python ๊ธฐ๋ณธ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. setup.py build ์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฒ„์ „ ๋ฒˆํ˜ธ๋Š” setup.py ํ•˜๋“œ์ฝ”๋”ฉ๋˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ๊ฒฝ์šฐ git ํƒœ๊ทธ์—์„œ ๋Œ€์‹  ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(setuptools-scm ํŒจํ‚ค์ง€ ์‚ฌ์šฉ).
  • ์ •์  ๋ฐ”์ธ๋”ฉ ๋Œ€์‹  ๊ธฐ๋ณธ libseccomp์— ๋Œ€ํ•œ ๋™์  ๋ฐ”์ธ๋”ฉ. (์ด๋ฏธ #217์—์„œ ์ œ์•ˆ๋จ)

pytest ๋˜๋Š” nose2 ์Šคํƒ€์ผ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ๋„ค์ดํ‹ฐ๋ธŒ ํŒŒ์ด์ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ด์‹ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ํ•˜๋„ค์Šค๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์‚ดํŽด๋ณด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์†Œ์Šค ๋ฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐฐํฌํŒ ๋ชจ๋‘์— ๋ฐฐํฌ ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์ด๊ฒƒ์„ v2.6์— ๋Œ€ํ•ด ์ž ์ •์ ์œผ๋กœ ํ‘œ์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” "v2.5๊ฐ€ ์ถœ์‹œ๋œ ํ›„ ์–ธ์  ๊ฐ€"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. v2.5๋ฅผ ์™„๋ฃŒํ•˜๋Š” ๊ฒƒ์ด ์ง€๊ธˆ ์šฐ๋ฆฌ์˜ ์šฐ์„  ์ˆœ์œ„์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

libseccomp pip-installable์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ €์—๊ฒŒ๋„ ๋งค์šฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์•Œ์•„๋‚ด๋ ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ make/poetry/docker(๋ฐ setup.py ํŒจ์น˜)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„๋งˆ์ถ”์–ด ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ sudo๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ๋นŒ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์กฐ์ •/์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

build-seccomp/setup.py ( /src/python/setup.py ์•ฝ๊ฐ„ ์ˆ˜์ •๋จ):

# OLD IMPORTS
# -----------------------------------------
# import os 
# 
# from distutils.core import setup
# from distutils.extension import Extension
# from Cython.Distutils import build_ext
# -----------------------------------------

# Replace with these NEW IMPORTS
# -----------------------------------------
import os

from setuptools import setup, Extension
from Cython.Distutils import build_ext
# -----------------------------------------

# rest of the file unmodified...

๋ฉ”์ดํฌํŒŒ์ผ :

.ONESHELL: install-libseccomp-native install-libseccomp-deps install-libseccomp build-whl-libseccomp

SECCOMP_BUILD_ENV = VERSION_RELEASE="0.0.0" \
                    CPPFLAGS="-I ../../include " \
                    CFLAGS="-Wall -g -O2" \
                    LDFLAGS="-Wl,-z -Wl,relro "
WHEEL_DIR = $(CURDIR)/dist

install-libseccomp-native:
ifeq (,$(wildcard libseccomp/.)) # If already cloned/built ignore
    git clone https://github.com/seccomp/libseccomp.git --branch v2.4.3 --depth 1
    cp build-seccomp/setup.py libseccomp/src/python/setup.py
    cd libseccomp
    ./autogen.sh
    ./configure --prefix=$(CURDIR)/libseccomp/build-aux
    make install
endif

install-deps:
    poetry install --no-root

# `make install-libseccomp` will install seccomp library into poetry virtual environment.
# this is a good option for local development
install-libseccomp: install-libseccomp-native install-deps
    cd libseccomp/src/python
    export $(SECCOMP_BUILD_ENV)
    poetry run python setup.py install

# `make build-whl-libseccomp` will create a .whl file for the seccomp library
# this is a good option for generating a build artifact in CI/CD or Docker
build-whl-libseccomp: install-libseccomp-native install-deps
    cd libseccomp/src/python
    export $(SECCOMP_BUILD_ENV)
    poetry run python setup.py bdist_wheel --dist-dir=$(WHEEL_DIR)

build-docker:
    docker build -t libseccomp-python .

run-docker:
    docker run --env SOME_VAR_1=42 --env SOME_VAR_2="Hello, World!" libseccomp-python

Dockerfile (๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋™๋“ฑํ•˜์ง€๋งŒ ๋”

# ============= BUILD STAGE ============= #
FROM python:3.8.3-buster as builder

# Install poetry
RUN pip install "poetry==1.0.5"

# Build/install wheels
WORKDIR /app
COPY pyproject.toml poetry.lock Makefile ./
COPY build-seccomp ./build-seccomp
RUN make build-whl-libseccomp

# ========== FINAL IMAGE STAGE ========== #
FROM python:3.8.3-slim-buster

# Install application
COPY --from=builder /app/dist /app/dist
WORKDIR /app
RUN pip install --no-index --find-links dist seccomp
COPY app ./app

# Configure
ENV SOME_VAR_1=
ENV SOME_VAR_2=

# Run the application
CMD ["python", "app/main.py"]

pyproject.toml :

[tool.poetry]
name = "libseccomp-demo"
version = "0.1.0"
description = "Building libseccomp for Python projects."
authors = ["Han Solo"]

[tool.poetry.dependencies]
python = "^3.8"

[tool.poetry.dev-dependencies]
cython = "^0.29.19"
wheel = "^0.34.2"

[build-system]
requires = ["poetry==1.0.5"]
build-backend = "poetry.masonry.api"

์•ฑ/๋ฉ”์ธ.py :

import os
import seccomp

print(os.environ['SOME_VAR_1'])
print(os.environ['SOME_VAR_2'])

๋‚˜๋Š” ๋‹จ์ง€ ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋„์›€์— ๋Œ€ํ•ด "๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค"๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. @drakenclimber ์™€ ์ €๋Š” v2.5.0 ๋ฆด๋ฆฌ์Šค๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ ๋ฐ”์˜๊ธฐ ๋•Œ๋ฌธ์— ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ด ์ ์„ ์žŠ์ง€ ์•Š๊ณ  ์žˆ๋‹ค๊ณ  ์•ฝ์†๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰