Pyramid Security
Who are you?

村岡友介

MURAOKA Yusuke
@jbking
Self Contractor
pylons-ja
pypy-ja
django-ja
Agenda

Security

Basics

Authentication

Authorization

Advanced
Before dive into...
 http://bit.ly/PyramidSecurity-
What about Security
                      applicatio     csrf,
                           n     injections,
Tons of topics we                    xss
could discuss                     identifier,
                     framework authn,
Can be categorized                  authz
into some layers                 poisoning,
                        infra-
                      structure    sniffing,
We focus today
“framework”layer
                                    ddos
                                 shoulder
                       social
                                   hack
No Security Pyramid
  development.ini
  production.ini
  proj/templates/mytemplate.pt
  proj/models.py
  proj/views.py
  proj/scripts
  proj/scripts/initializedb.py
  proj/scripts/__init__.py
  proj/__init__.py
  proj/tests.py
                                 small starting...
No Security Pyramid
  development.ini
                                   Configuration
  production.ini
  proj/templates/mytemplate.pt
  proj/models.py
                                    MV of MVC
  proj/views.py
  proj/scripts
  proj/scripts/initializedb.py
  proj/scripts/__init__.py
  proj/__init__.py                Make WSGI app
  proj/tests.py
                                 small starting...
Security
Basics

Authentication

  /etc/passwd

Authorization

  ls -l .

  -rw-r--r-- 1 yusuke staff
Basics
Basics
Easy enough?
How to Enable Security
# in bootstrap
authentication_policy = AnAuthenticationPolicy()
authorization_policy = AnAuthorizationPolicy()
config = Configurator(settings=settings)
config.set_authentication_policy(authentication_policy)
config.set_authorization_policy(authorization_policy)
# in views
@view_config(permission=’...’, ...)
def logout(request):
  headers = forget(request)
  ...
Authentication in
     Usage

authenticated_userid(request)
unauthenticated_userid(request)
effective_principals(request)
forget(request)
remember(request, principal, **kw)
Authentication in
     Usage

authenticated_userid(request)
unauthenticated_userid(request)
effective_principals(request)
forget(request)                      Response
remember(request, principal, **kw)    Headers
Authentication Policy

  interface IAuthenticationPolicy
    authenticated_userid(request)
    unauthenticated_userid(request)
    effective_principals(request)
    remember(request, principal, **kw)
    forget(request)
Authentication Policy

  interface IAuthenticationPolicy
    authenticated_userid(request)
    unauthenticated_userid(request)      Principals
    effective_principals(request)
    remember(request, principal, **kw)   Response
    forget(request)                       Headers
Bundled
Authentication Policy

   AuthTktAuthenticationPolicy

   RemoteUserAuthenticationPolicy

   RepozeWho1AuthenticationPolic
   y
Authorization in Usage


has_permission(permission, context, request)
principals_allowed_by_permission(context, permission)
view_execution_permitted(context, permission, name=’’)
Authorization in Usage


                                               Check
has_permission(permission, context, request) Permissio
                                                  n
principals_allowed_by_permission(context, permission)
view_execution_permitted(context, permission, name=’’)
Authorization Policy


interface IAuthorizationPolicy
  principals_allowed_by_permission(context, permission)
  permits(context, principals, permission)
Authorization Policy


interface IAuthorizationPolicy
  principals_allowed_by_permission(context, permission)
                                             Check
  permits(context, principals, permission)   Permissio
                                                 n
Bundled Authorization
       Policy

      ACLAuthorizationPolic
Any Question?
Advanced
Security Pyramid
development.ini
production.ini
proj/templates/mytemplate.pt
proj/models.py
proj/views.py
proj/resources.py
proj/authentication.py
proj/authorization.py
...
Security Pyramid
development.ini
production.ini
proj/templates/mytemplate.pt
proj/models.py
proj/views.py
proj/resources.py              Find Resource
proj/authentication.py
                           Custom Security
proj/authorization.py
...
Typical Stack
# in bootstrap
authentication_policy = 
CustomAuthTktAuthenticationPolicy('seekrit')
authorization_policy = ACLAuthorizationPolicy()
config.add_route(..., ..., factory=resources.find_object)
# in resources
def find_object(request):
    obj = ...
    assert getattr(obj, ‘__acl__’, None) is not None
    return obj
# in models
class Model:
   __acl__ = [(Allow, Authenticated, ‘view’)]
Always Tom
          Authentication
class AlwaysTomPolicy(CallbackAuthenticationPolicy):
  def unauthenticated_userid(self, request):
    return ‘tom’
  def remember(self, request, principal, **kw):
    return []
  def forget(self, request):
    return []
LDAP? Other Authn?


   pip search repoze.who
Any Question again?
Thanks :)

Pyramid Security