You are not permitted to download, save or email this image. Visit image gallery to purchase the image.
Steyn kicked six penalties and a conversion against a Stormers side who made too many unforced errors and could not take their chances in a game that revealed plenty of rustiness in both teams.
"We were beaten by the better team, we made too many mistakes and gave away too many silly penalties in the dangerous places on the field. It is a big wakeup call for us," Stormers skipper Jean de Villiers said.
Both sides struggled at set-pieces during a disjointed first half with the Stormers, in particular, turning over possession in promising positions.
They had their lineout poached five metres from the Bulls' line in their only real attack in the Bulls 22 and, despite having the heavier pack, were second best at the scrums.
Repeated infringements in their own half allowed Steyn three penalty shots at goal and he converted them all to give the home side a 9-0 lead at the break.
The Stormers had their opportunities, but flyhalf Elton Jantjies, on loan from the Lions, had an awful game with the boot, missing three penalties in the opening half.
"We were very lethargic in the first 40 minutes, we were watching the game rather than playing," De Villiers said.
Steyn added his fourth penalty shortly after the restart to extend the Bulls advantage and, when Jantijies then missed a relatively simple penalty in the second half, the game plan of the visitors changed, leading to the game's opening try.
The Stormers received another penalty in a kickable position, but instead went for the attacking lineout and they built some phases in the Bulls 22 during a period of sustained pressure.
The ball eventually came out wide to Bryan Habana and, although the winger was pulled up centimetres short of the tryline, de Villiers picked up the ball at the base of the ruck and dived over the line.
The Stormers used the break in play while referee Jaco Peyper checked the validity of the try to bring on second-choice goal-kicker Joe Pietersen, who converted from the touchline.
Pietersen kicked a penalty shortly afterwards and suddenly the Stormers were within two points.
But, having worked their way back into the game, they handed the initiative back to the Bulls with poor handling and more set-piece woe.
Steyn kicked two more penalties before the home side wrapped up the game with a try. Derick Hougaard grubber kicked a ball through and, although Chilliboy Ralepelle was in an offside position, the ball flicked off the Stormers' Frans Malherbe and played him onside.
He was able to dive on the ball for the try and, although the Stormers got a late consolation through Andres Bekker, they could not find another score.