Kanaan snapped a 34-race, two-year IZOD IndyCar Series winless streak. He passed Castroneves with 10 laps remaining and then held him off down the stretch, finishing 4.2 seconds in front.
Kanaan registered his 14th career IndyCar win and first since June 2008 at Richmond, Va.
Finishing third was E.J. Viso with Ryan Briscoe and pole sitter Will Power trailing behind in fourth and fifth place, respectively.
With his Sunday finish, Power improved his points lead over sixth-place finisher Scott Dixon to 11.
Meanwhile, 2007 and 2009 Iowa winner Dario Franchitti encountered a gear-box issue late in the race and ended up finishing 18th.